模拟问题

1.约瑟夫问题:用aLoop来模拟n个猴子,移除的就把数组置零。设置一个整型指针来指向当前数到的数组位置。

#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 300

int aLoop[MAX_NUM];
void main()
{
    int n,m,i;
    int nPtr;
    int nCount;
    while(1)
    {
        scanf("%d%d",&n,&m);
        if(n==0) break;

        for(i=0;i<n;i++) aLoop[i]=i+1;
        nPtr=0;
        for(i=0;i<n;i++)
        {
           nCount=0;
           while(nCount<m)
           {
               while(aLoop[nPtr]==0)
                   nPtr = (nPtr+1)%n;
               nCount++;
               nPtr = (nPtr+1)%n;
           }
           nPtr--;//要记得回退一位
           if(nPtr<0) nPtr = n-1;//-1之后nPtr有可能是-1

           if(i==n-1) printf("%d\n",aLoop[nPtr]);
           aLoop[nPtr] = 0;//先输出再置零
        }
    }
}

2.花生问题:输入一个矩阵之后,首先要找到最大花生的位置,其次计算到新的位置会否超时。注意要看是否在路边。

#include <stdio.h>
#include <stdlib.h>
int Field[55][55];

void main()
{
    int M,N,K;
    scanf("%d%d%d",&M,&N,&K);
    int m,n;
    for(m=1;m<=M;m++)
        for(n=1;n<=N;n++)
            scanf("%d",&Field[m][n]);
    
     int nPeanuts=0;
     int nTime=0;
     int nCuri=0,nCurj;

     int i,j;
     while(nTime<K)
     {
         int nMax=0,nMaxi,nMaxj;
         for(i=1;i<=M;i++)//找到最大的花生位置
            for(j=1;j<=N;j++)
                if(nMax<Field[i][j])
                {
                    nMax=Field[i][j];
                    nMaxi=i;
                    nMaxj=j;
                }
         
            if(nMax==0) break;
            if(nCuri==0) nCurj=nMaxj;//在路边的话要移动

            nTime += 1+abs(nMaxi-nCuri)+abs(nMaxj-nCurj);
            if(nTime>K) break;
            nCuri=nMaxi;nCurj=nMaxj;
            nPeanuts += Field[nMaxi][nMaxj];
            Field[nMaxi][nMaxj]=0;
     }
     printf("%d\n",nPeanuts);
}

3.显示器:主要就是把每个笔画存到字符串里,然后根据字母和行数来进行输出。

#include <stdio.h>
#include <string.h>

char n1[11]={"- -- -----"};
char n2[11]={"|   ||| ||"};
char n3[11]={"|||||  |||"};
char n4[11]={"  ----- --"};
char n5[11]={"| |   | | "};
char n6[11]={"|| |||||||"};
char n7[11]={"- -- -- --"};

void main()
{
    int s;
    char szNumber[20];
    int nDigit[8]={0},i,j,k,nLength;

    while(1)
    {
        scanf("%d%s",&s,szNumber);
        if(s==0) break;

        nLength=strlen(szNumber);
        for(i=0;i<nLength;i++)//检查每个字符//输出所有数字的笔画1
        {
            nDigit[i]=szNumber[i]-'0';
        }   

        for(i=0;i<nLength;i++)
        {
            printf(" ");
            for(j=0;j<s;j++)//每个字符输出s个笔画
                printf("%c",n1[nDigit[i]]);
            printf(" ");
        }
        printf("\n");
        
        for(j=0;j<s;j++)
        {
            for(i=0;i<nLength;i++)
            {
              printf("%c",n2[nDigit[i]]);
              for(k=0;k<s;k++) printf(" ");
              printf("%c",n3[nDigit[i]]);
            }
        printf("\n");
        }

    //  printf("\n");
        for(i=0;i<nLength;i++)
        {
            printf(" ");
            for(j=0;j<s;j++)//每个字符输出s个笔画
                printf("%c",n4[nDigit[i]]);
            printf(" ");
        }

        printf("\n");
        for(j=0;j<s;j++)
        {
            for(i=0;i<nLength;i++)
            {
              printf("%c",n5[nDigit[i]]);
              for(k=0;k<s;k++) printf(" ");
              printf("%c",n6[nDigit[i]]);
            }
        printf("\n");
        }
        //printf("\n");
        for(i=0;i<nLength;i++)
        {
            printf(" ");
            for(j=0;j<s;j++)//每个字符输出s个笔画
                printf("%c",n7[nDigit[i]]);
            printf(" ");
        }
    }//while
}//main

4.排列问题:
(1)如何找当前排列的下一个排列

以(2147653)为例子,首先找到aj满足aj-1<aj,(4),其次在j-n里面找最小的比aj-1大的数,并且让这个数和aj-1互换位置,(2157643),最后把j-n升序排列(2153467)

(2)判断一下当前的排列是否已经是降序,如果是降序,那么直接输出升序即可。
(3)qsort的用法:qsort(排列数组的起始地址,排列个数,排列元素的内存大小,比较函数)

#include <stdio.h>
#include <stdlib.h>

#define MAX_NUM 1024
int an[MAX_NUM];

int MyCompare(const void *e1,const void *e2)
{
    return *((int*)e1)-*((int*)e2);
}


void main()
{
    int M;
    int n,k,i,j,tt;
    scanf("%d",&M);

    while(M--)
    {
        scanf("%d%d",&n,&k);//输入
        for(i=1;i<=n;i++)
            scanf("%d",&an[i]);

        an[0]=100000;
        for(i=0;i<k;i++)//每次循环都找出下一个排列
        {
            for(j=n;j>=1&&an[j-1]>an[j];j--);
            if(j>=1)
            {
               //找到j到n中比当前j-1大的最小的数
                int nMin=an[j];
                int nMinIdx = j;
                for(tt=j;tt<=n;tt++)
                  if(an[tt]>an[j-1] && an[tt]<nMin)
                  {
                      nMin = an[tt];
                      nMinIdx = tt;
                  }
                //交换位置
                an[nMinIdx]=an[j-1];
                an[j-1]=nMin;
                qsort(an+j,n-j+1,sizeof(int),MyCompare);//排序
            }
            else//已经是降序了
            {
                for(j=1;j<=n;j++)
                    an[j]=j;         
            }
        }
        for(j=1;j<=n;j++)
            printf("%d ",an[j]);
        printf("\n");
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,468评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,620评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,427评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,160评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,197评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,334评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,775评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,444评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,628评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,459评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,508评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,210评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,767评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,850评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,076评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,627评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,196评论 2 341

推荐阅读更多精彩内容

  • 简述题目 在一个系统中,有两种放射性原子A和B,原子A会衰变成原子B,而原子B也会衰变成原子A。严格上来说,这并不...
    RicardoZiTseng阅读 656评论 0 1
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,716评论 0 33
  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 3,250评论 0 18
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,204评论 0 4
  • 玉树琼枝催朽老,蚕眉倒卧笑乾坤。 不知立夏从头越,好在浓荫欲断魂。 断魂,销魂神往。 形容一往情深或哀伤。
    不惑而歌阅读 286评论 7 16