今天作了四道题,可是这里只放三道,最后一道题我不会,第一题和第二题有错误。ios
题目描述:小王同窗在坐标系的(0,0)处,可是他找不到考试的试场,因而一边走路一边问路, 每一个被问路的人会告诉他一个指令(包括走路或转弯),如今请编一个程序,显示他每次走 路后的坐标(转弯后坐标不变,因此没必要显示坐标)。 初始方向向 y 轴正半轴!!数组
一开始以为这道题很简单嘛,实际上这题的确很简单,直接放代码把:函数
#include<iostream> #include<cstdio> #include<cstring> using namespace std; long long n,a=0,b=0,q=0,hhh=0; int dx[5]={0,1,0,-1};//这是用来在须要走相应步数时对应的方向 int dy[5]={1,0,-1,0}; string s; int main(){ scanf("%lld",&n); for(int i=0;i<n;i++){ cin>>s; if(s[0]>='0'&&s[0]<='9'){ long long hh=0; for(int i=0;i<s.length();i++){//若是输入的是数字而不是指令那么久用一个变量把这个数字存起来 hh*=10; hh+=s[i]-'0'; } a+=hh*dx[q];//x和y都按照指令行走相应的步数 b+=hh*dy[q]; printf("(%lld,%lld)\n",a,b);//每次行走都要输出 hhh=1;//原本我也忘了,若是只是转了方向而没有走路的话,那么坐标就是(0,0),我一开始没有让他输出,不过这不是什么大问题,用一个标记数组标记一下最后判断就行了,因此我就直接加上了。 } else{//若是这不是数字而是指令 if(s=="left"){//那么判断是这两种里面的哪种指令,若是是left就让变量q--(这是为了让他走路的时候走正确的方向) if(q>0) q--; else q=4;q--; } if(s=="right"){//若是是right就让变量q++ if(q<3) q++; else q=0; } } } if(hhh==0) printf("(0,0)\n");//若是没有走路的话就输出(0,0) return 0; }
可是我犯了一个致命错误:spa
由于若是else后面不加大括号只能执行一条语句(这个我也是才刚刚知道,否则也不可能错了)code
因此咱们把p=4;p--;这两条语句改为p=3;这一条就AC了。blog
题目描述:在一个大试场里,有 n 行 m 列的考生,小王和众多同窗正在考试,这时,有一部分考生 做弊,固然,监考老师能发现他们。可是只有一个监考老师,他因为高度近视,只能发现与 他同行同列的做弊者,并且因为监考老师年老体弱,在考试过程当中没法移动。如今已知 n*m 个考生中谁在做弊,请帮监考老师找一个位置,能够发现最多的做弊者(监考老师能够和某 个考生在同一位置)。若是监考老师的位置上的考生在做弊,那么监考老师先先后看,发现 他做弊,再左右看,又发现他做弊,算作发现 2 个考生做弊。ci
这题同样,我也是手残了,原本很简单,只要遍历一遍每次判断就能够了:string
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,a[1010][1010],maxx=0; int main(){ scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ scanf("%d",&a[i][j]); } }//以上为输入 for(int i=0;i<n;i++){//遍历一遍数组 for(int j=0;j<m;j++){ int hh=0;//每次都定义一个用来计数的变量hh for(int k=0;k<n;k++){//先遍历这一个老师所在的点的一行中有多少个做弊的 if(a[k][j]==1) hh++; } for(int k=0;k<n;k++){//先遍历这一个老师所在的点的一列中有多少个做弊的 if(a[i][k]==1) hh++; } maxx=max(maxx,hh);//最后比较大小,保存更大的 }//由于咱们用了两个for循环分别遍历了老师所在的行和列,而老师所在的点呢,就被判断了两次,因此咱们也不用能够去根据题目要求判断什么的了 } printf("%d\n",maxx);//输出 return 0; }
可是你们必定能发现一个致命的问题:io
由于这个for跟上面那个for很像嘛,因此我就直接复制过来了,可是我没有改掉k<n,致使我直接就WA了。
for循环
把k<n改成k<m就AC了。
题目描述:小王在考试中遇到一道难题:方程 a1+a2+„„+an=m 的非负整数解有几个,请你帮他算 一下(这也能够算做他做弊吧)。
深搜就好,我直接放代码了:
#include<iostream> #include<cstdio> using namespace std; int n,m,ans=0,a[1010][1010]; void dfs(int idx,int hh){ if(idx==n){//若是到达了一个目标 if(hh==0) ans++;//若是到达了最终目标,就让总个数加加 return;//返回上一层 } for(int i=0;i<=m;i++){ if((hh-i)>=0&&idx+1<=n){//这个判断不加也不要紧,不过加了能够省很多步骤 dfs(idx+1,hh-i);//调用dfs函数进行深搜 } } return; } int main(){ scanf("%d%d",&n,&m); dfs(0,m);//调用深搜函数 printf("%d\n",ans); return 0; }