编程学习笔记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]); }
相关文章推荐
- C#模拟死锁问题
- 一个IQ问题的C++模拟
- 用 TStringList 模拟 "将字符串转换为变量的功能" - 回复 "flq_00000" 和 "外来天客" 的问题
- Axure RP Pro - 相关问题 - 模拟加法运算
- 数据结构作业 迷宫问题 模拟 之基础的BFS DFS
- 一时技痒 不用模拟第一印象的构造 通过三个观察得来的规律解决N^2个往返接力问题
- 用C#线程技术模拟“生产者-消费者”经典进程同步问题
- [VB.NET]问一个键盘的模拟问题,如何做一个画面键盘来代替微软的软键盘,有点难度呀!!!
- 模拟点击网页中的按钮 - 回复 "starcraft_ly" 的问题
- 多线程模拟哲学家就餐问题
- 用matlab模拟一道概率投资问题
- 以用户模拟方式解决手动设置权限问题
- 用向下箭头模拟TAB键问题
- Dynamips模拟3660桥接PC后与实际网络通讯问题
- SWMM引擎之二——在读SWMM模拟结果时应注意的问题
- 开发键盘过滤驱动实现模拟按键过程中遇到的问题
- Dynamips模拟3660桥接PC后与实际网络通讯问题
- 解决eclipse搭建索爱sdk模拟程序时出现的"Couldn`t load zayitlib.dll library"问题
- java多线程之生产者与消费者问题的简单模拟
- 用C#模拟“嗜睡的理发师”问题