您的位置:首页 > 编程语言

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

2014-12-20 20:25 190 查看



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

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

打字时一个常见的错误就是没有把手放在正确位置,而是偏右边一个位置。所以会发生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]);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: