Problem 1056 扫雷游戏
Problem Description
扫雷是Windows自带的游戏。游戏的目标是尽快找到雷区中的所有地雷,而不许踩到地雷。如果方块上的是地雷,将输掉游戏。如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷。
你的任务是在已知地雷出现位置的情况下,得到各个方块中的数据。
*...
.... “*”表示有地雷
.*.. “.”表示无地雷
....
经过处理应得到
*100
2210
1*10
1110
Input
输入有多组数据,每组数据的第一行有两个数字,m,n(0<m,n<100)表示游戏中雷区的范围为m×n。接下来m行每行有n个字符。“*” 表示有地雷,“.”表示无地雷。最后一组数据m=0,n=0表示输入结束,不需要处理。
Output
对于每组输入数据,输出结果,各方块数字间不留空格。每组结果之后有一个空行。
Sample Input
2 3
***
...
4 4
*...
....
.*..
....
0 0
Sample Output
***
232
*100
2210
1*10
1110
#include <iostream> #include <string.h> using namespace std; int main() { int i,j,m,n,sum; char a[105][105]; memset(a,0,sizeof(a)); while(cin>>m>>n && m!=0 ||n!=0) { memset(a,0,sizeof(a)); //赋初值一定要放在循环里面,不然上次保存的数据还会被使用 for(i=1;i<=m;i++) //比如 第一次输入a[3][3]为 * { //第二次大小为2*2 那么就会多算 for(j=1;j<=n;j++) { cin>>a[i][j]; } } for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { if(a[i][j]=='*') cout<<"*"; else if(a[i][j]=='.') { sum=0; if(a[i][j+1]=='*') sum++; if(a[i][j-1]=='*') sum++; if(a[i-1][j]=='*') sum++; if(a[i-1][j+1]=='*') sum++; if(a[i-1][j-1]=='*') sum++; if(a[i+1][j]=='*') sum++; if(a[i+1][j+1]=='*') sum++; if(a[i+1][j-1]=='*') sum++; cout<<sum; } } cout<<endl; } cout<<endl; } return 0; }