编程学习笔记11--模拟问题

来源:互联网 发布:b超单上的数据 编辑:程序博客网 时间:2024/06/06 05:52


现实中的有些问题难以找到公式或规律来解决。只能按照一定步骤不停地做下去,最后才能得到答案。这样的问题,用计算机来解决

十分合适,只要能让计算机模拟人在解决问题时的行为即可。这一类的问题可以称之为模拟题

打字时一个常见的错误就是没有把手放在正确位置,而是偏右边一个位置。所以会发生Q被打成W,J被打成K等等的情况。你的任务就是要把打错的字修正回来
Description
   Input
输入包含许多列,每列可能包含有数字,空格符,大写英文字母(Q、A、Z除外),标点符号(`除外)。
Output
对每一列中的每个字符,请输出在键盘(如上图)上其左边一个位置的字符。但是输入中的空格符,输出时亦请输出空格符。
Sample input
O S, GOMR YPFSU/
URD. ,U [JPMR MI,NRT OD 8346333
Sample Output
I AM FINE TODAY.
YES, MY PHONE NUMBER IS 7235222

#include<stdio.h>#include<string.h>char key[]="QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./`1234567890-";//用数组存储所有的内容比较方便int main(){    char str[80];    int i,j,len1,len2;    while(gets(str)!=NULL)    {        len1=strlen(str);        len2=strlen(key);        /**对键盘出错的进行模拟修正*/        for(i=0;i<len1;i++)        {            if(str[i]!='Q'&&str[i]!='A'&&str[i]!='Z'&&str[i]!='\`')            {                for(j=0;j<len2;j++)                {                   if(str[i]==key[j])                   {                       putchar(key[j-1]);                       break;                   }                }                if(j==len2)                {                    putchar(str[i]);                }            }            else            {                putchar(str[i]);            }        }        putchar('\n');    }}


约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

普通模拟过程的办法
#include<stdio.h>#include<string.h>#define M 300+10struct monkey{    int num;    int say_num;    int state;};int main(){    struct monkey MON[M];    int i,t,head,m,n;    int count_1,count_m;    scanf("%d %d",&n,&m);    count_1=0;//在圈子里的猴子的个数    count_m=1;//从1开始数    for(i=1;i<=n;i++)    {       MON[i].num=i;       MON[i].state=1;       MON[i].say_num=0;    }   while(1)   {       count_1=0;       for(i=1;i<=n;i++)       {           if(MON[i].state==1)//如果猴子在圈子内部......1           {               count_1++;               MON[i].say_num=count_m++;               head=i;//暂时认为这一个猴子是猴王               //判断猴子数到的数是不是m,并且还要对state判断是否为1,原来写在..1外面了,不正确               if(MON[i].say_num==m)               {                    count_m=1;                    MON[i].state=0;               }           }        }        if(count_1==1)//如果只有一个在内,就把当初暂时认为是猴王的猴子的编号输出        {           printf("%d",head);           break;        }   }   return 0;}
用队列处理
#include<stdio.h>#include<string.h>#define M (300+10)*10struct Q{    int monkey[M];    int head;    int rear;};int main(){    struct Q Q_m;//猴子的队列    Q_m.head=-1;    Q_m.rear=-1;    int n,m,i,count_m=0;    scanf("%d %d",&n,&m);    for(i=1;i<=n;i++)//所有的猴子进入队列    {        Q_m.monkey[++Q_m.rear]=i;    }    while(Q_m.rear>Q_m.head)    {        Q_m.head++;//不论情况下,每次head都需要向后移动一位。        count_m++;        if(count_m!=m)//没有数到m就插入队列        {            Q_m.monkey[++Q_m.rear]=Q_m.monkey[Q_m.head];        }        else//否则不进入队列,并且对m的计数清除为0        {            count_m=0;        }    }    printf("%d",Q_m.monkey[Q_m.head]);}

















0 0
原创粉丝点击