Problem 1056 扫雷游戏
Accept: 2624 Submit: 6903
Time Limit: 1000 mSec Memory Limit : 32768 KB
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;
}