扫雷游戏
| Time Limit:1s | Memory limit:32M |
| Accepted Submit:696 | Total Submit:1774 |
|
扫雷是Windows自带的游戏。游戏的目标是尽快找到雷区中的所有地雷,而不许踩到地雷。如果方块上的是地雷,将输掉游戏。如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷。 你的任务是在已知地雷出现位置的情况下,得到各个方块中的数据。 *... .... “*”表示有地雷 .*.. “.”表示无地雷 ....经过处理应得到 *100 2210 1*10 1110 输入 输入有多组数据,每组数据的第一行有两个数字,m,n(0<m,n<100)表示游戏中雷区的范围为m×n。接下来m行每行有n个字符。“*” 表示有地雷,“.”表示无地雷。最后一组数据m=0,n=0表示输入结束,不需要处理。输出 对于每组输入数据,输出结果,各方块数字间不留空格。每组结果之后有一个空行。输入样例 2 3 *** ... 4 4 *... .... .*.. .... 0 0 输出样例 *** 232 *100 2210 1*10 1110 Original: FZUPC Warmup 2005 |
解题:
应该有更简单的方法的。有知道的请赐教。
#include <iostream>
using namespace std;
int main()
{
int m,n,i,j;
char a[101][101];
while (cin>>m>>n && m!=0 && n!=0)
{
memset(a,'0',sizeof(a));
cin.ignore();
for (i=0;i<m;i++)
{
cin.getline(a[i],n+1);
}
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
if (a[i][j]=='.')
{
a[i][j]='0';
}
}
}
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
if (a[i][j]=='*')
{
if (i>0 && j>0 && a[i-1][j-1]!='*')
{
a[i-1][j-1]++;
}
if (i>0 && a[i-1][j]!='*')
{
a[i-1][j]++;
}
if (i>0 && j<n-1 && a[i-1][j+1]!='*')
{
a[i-1][j+1]++;
}
if (j>0 && a[i][j-1]!='*')
{
a[i][j-1]++;
}
if (j<n-1 && a[i][j+1]!='*')
{
a[i][j+1]++;
}
if (i<m-1 && j>0 && a[i+1][j-1]!='*')
{
a[i+1][j-1]++;
}
if (i<m-1 && a[i+1][j]!='*')
{
a[i+1][j]++;
}
if (i<m-1 && j<n-1 && a[i+1][j+1]!='*')
{
a[i+1][j+1]++;
}
}
}
}
for (i=0;i<m;i++)
{
cout<<a[i]<<endl;
}
cout<<endl;
}
return 0;
}
632

被折叠的 条评论
为什么被折叠?



