P2670 扫雷游戏(此为超链接)
扫雷游戏非常经典解压,通过观察多个数字,最终判断雷的位置。
(图为扫雷游戏)
本题目要求将非雷格周围的雷用数字写出;需要先定义二维字符数组(我也不知道怎么叫);运用循环将其输入,进行判断,然后输出结果。
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int main() 5 { 6 int m,n; 7 char a[101][101];//定义二维字符数组 8 cin>>n>>m; 9 for(int i=0;i<n;i++) 10 { 11 for(int j=0;j<m;j++) 12 { 13 cin>>a[i][j]; //通过循环输入 14 } 15 } 16 for(int i=0;i<n;i++) 17 { 18 for(int j=0;j<m;j++) 19 { 20 int sum=48; 21 if(a[i][j]!='*') 22 { 23 /*若为雷,则保持不变。若不为雷,则对周围雷数进行判断*/ 24 if(a[i][j]=='?') 25 a[i][j]='0';//若a[i][j]周围无雷,则输出"0" 26 if(a[i-1][j-1]=='*') 27 { 28 a[i][j]=sum+1; 29 sum++; 30 } 31 if(a[i-1][j]=='*') 32 { 33 a[i][j]=sum+1; 34 sum++; 35 } 36 if(a[i-1][j+1]=='*') 37 { 38 a[i][j]=sum+1; 39 sum++; 40 } 41 if(a[i][j-1]=='*') 42 { 43 a[i][j]=sum+1; 44 sum++; 45 } 46 if(a[i][j+1]=='*') 47 { 48 a[i][j]=sum+1; 49 sum++; 50 } 51 if(a[i+1][j-1]=='*') 52 { 53 a[i][j]=sum+1; 54 sum++; 55 } 56 if(a[i+1][j]=='*') 57 { 58 a[i][j]=sum+1; 59 sum++; 60 } 61 if(a[i+1][j+1]=='*') 62 { 63 a[i][j]=sum+1; 64 sum++; 65 }} 66 } 67 } 68 for(int i=0;i<n;i++) 69 { 70 for(int j=0;j<m;j++) 71 cout<<a[i][j];//将结果输出 72 cout<<endl; 73 } 74 return 0; //return 0;好习惯 75 }
也可以通过判断雷的位置,将其周围的8个格(雷除外)全部+1,再输出答案;具体代码如下:
#include<iostream> using namespace std; int main() { char a[101][101]; int b[101][101],n,m,i,j;//数组定义(二维) cin>>n>>m;//读入行、列 for(i=0;i<101;i++) for(j=0;j<101;j++) b[i][j]=0;//给数组赋值为0 for(i=0;i<n;i++) for(j=0;j<m;j++) { cin>>a[i][j]; if(a[i][j]=='*')//判断:如果是地雷 { b[i+1][j+1]++; b[i+1][j-1]++; b[i+1][j]++; b[i][j+1]++; b[i][j-1]++; b[i-1][j]++; b[i-1][j+1]++; b[i-1][j-1]++;//相邻的八个格子都+1 } } for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(a[i][j]=='*') cout<<"*";//如果是地雷(*) 原样输出 else cout<<b[i][j];//否则输出数字 } cout<<endl; } }
总结一下:本题考查字符串的知识,我考虑了两种情况(找无雷判断周围;找有雷周围加一),在相同的题目,会有不同的做法,从而写出时间复杂度不同的代码(本题都是O(n^2))再今后刷题再到比赛时,需要有这种变通与发散思维。