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


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

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

打字时一个常见的错误就是没有把手放在正确位置,而是偏右边一个位置。所以会发生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+10
struct 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)*10
struct 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值