编程学习笔记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
- 编程学习笔记11--模拟问题
- C++学习笔记之SendInput()模拟键盘输入的问题
- 模拟电路学习笔记
- 模拟电路学习笔记
- 模拟退火学习笔记
- 编程中的次要问题 --编程珠玑学习笔记 第五章
- 模拟电路学习笔记(1)
- matlab学习笔记:随机模拟
- 《编程之美》学习笔记——中国象棋将帅问题
- 《编程之美》学习笔记之 最大公约数问题
- 编程之美学习笔记(二):中国象棋将帅问题
- 编程珠玑第12章(取样问题)学习笔记
- 编程珠玑(2)第十二章学习笔记 取样问题
- 《编程之美》学习笔记 1.2中国象棋将帅问题
- 程序员编程艺术学习笔记(一)字符串左旋问题
- 程序员编程艺术学习笔记(二)字符串是否包含问题
- 【编程珠玑】学习笔记5——抽样问题
- 编程学习笔记1-基本的数学问题
- 标准ASCII表
- C++中的隐式构造,及const关键字
- MVB总线在地铁列车控制系统中的应用
- 压敏电阻的作用概述
- sockaddr与sockaddr_in 在网络编程中的使用
- 编程学习笔记11--模拟问题
- HDMI数字信号接口知识
- 视频基础知识—DVI简介
- 如何在视频分配器中提高信号完整性
- PC104总线
- lin 总线
- ubuntu 配置samba
- 波峰焊与回流焊
- 【手游游戏引擎】学习游戏开发的两个方向 Cocos2d-x 和 Unity 3D/2D (一)