冯泽来玩扫雷(搜索)
问题描述
在一个n*m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示)。
冯泽来想在每个空地上写下它周围8 个方向相邻的格子中有几个雷。
请帮助他输出写了之后的棋盘
输入
输入第一行包含两个整数n, m 代表棋盘大小
接下来n 行,每行m 个字符,代表棋盘
1≤n,m≤1000
输出
输出包含n 行,每行m 个字符,代表冯泽来写了数字之后的棋盘
输入样例1
3 3
*.*
...
*.*
输出样例1
*2*
242
*2*
此题解析略,直接找。。(也可以定义一个方向数组循环,只用注意外面套一层防止超界)
#include<cstdio>
#include<iostream>
using namespace std;
char a[1005][1005];
int n,m;
int main()
{
freopen("mine.in","r",stdin);
freopen("mine.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>m;//scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a[i][j];//scanf("%c",&a[i][j]);
if(a[i][j]=='.')
a[i][j]='0';
}
if(a[1][1]=='0')
{
if(a[2][1]=='*')a[1][1]++;
if(a[1][2]=='*')a[1][1]++;
if(a[2][2]=='*')a[1][1]++;
}
if(a[1][m]=='0')
{
if(a[1][m-1]=='*')a[1][m]++;
if(a[2][m]=='*')a[1][m]++;
if(a[2][m-1]=='*')a[1][m]++;
}
if(a[n][1]=='0')
{
if(a[n-1][1]=='*')a[n][1]++;
if(a[n-1][2]=='*')a[n][1]++;
if(a[n][2]=='*')a[n][1]++;
}
if(a[n][m]=='0')
{
if(a[n-1][m]=='*')a[n][m]++;
if(a[n][m-1]=='*')a[n][m]++;
if(a[n-1][m-1]=='*')a[n][m]++;//4角
}
for(int i=2;i<=m-1;i++)
{
if(a[1][i]=='0')
{
if(a[1][i-1]=='*')a[1][i]++;
if(a[1][i+1]=='*')a[1][i]++;
if(a[2][i]=='*')a[1][i]++;
if(a[2][i-1]=='*')a[1][i]++;
if(a[2][i+1]=='*')a[1][i]++;
}
if(a[n][i]=='0')
{
if(a[n][i-1]=='*')a[n][i]++;
if(a[n][i+1]=='*')a[n][i]++;
if(a[n-1][i]=='*')a[n][i]++;
if(a[n-1][i-1]=='*')a[n][i]++;
if(a[n-1][i+1]=='*')a[n][i]++;//横向两边
}
}
for(int i=2;i<=n-1;i++)
{
if(a[i][1]=='0')
{
if(a[i-1][1]=='*')a[i][1]++;
if(a[i+1][1]=='*')a[i][1]++;
if(a[i][2]=='*')a[i][1]++;
if(a[i-1][2]=='*')a[i][1]++;
if(a[i+1][2]=='*')a[i][1]++;
}
if(a[i][m]=='0')
{
if(a[i-1][m]=='*')a[i][m]++;
if(a[i+1][m]=='*')a[i][m]++;
if(a[i][m-1]=='*')a[i][m]++;
if(a[i-1][m-1]=='*')a[i][m]++;
if(a[i+1][m-1]=='*')a[i][m]++;//纵向两边
}
}
for(int i=2;i<=n-1;i++)
for(int j=2;j<=m-1;j++)
{
if(a[i][j]=='0')
{
if(a[i][j-1]=='*')a[i][j]++;
if(a[i][j+1]=='*')a[i][j]++;
if(a[i-1][j]=='*')a[i][j]++;
if(a[i+1][j]=='*')a[i][j]++;
if(a[i-1][j-1]=='*')a[i][j]++;
if(a[i+1][j-1]=='*')a[i][j]++;
if(a[i-1][j+1]=='*')a[i][j]++;
if(a[i+1][j+1]=='*')a[i][j]++;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<a[i][j];//printf("%c",a[i][j]);
cout<<endl;//printf("\n");
}
return 0;
}