[OpenJude]LGTB玩扫雷
题目描述
在一个n * m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示)。
LGTB 想在每个空地上写下它周围8 个方向相邻的格子中有几个雷。
请帮助他输出写了之后的棋盘
输入输出格式
输入格式
第一行包含两个整数n, m 代表棋盘大小
接下来n 行,每行m 个字符,代表棋盘
1 n,m 1000
输出格式
输出包含n 行,每行m 个字符,代表LGTB 写了数字之后的棋盘
输入输出样例
输入样例1
3 3
*.*
...
*.*
输出样例1
*2*
242
*2*
思路
模拟
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int n,m;
int Map[1001][1001];
const int dx[]={-1,-1,-1, 0,0, 1,1,1};
const int dy[]={-1, 0, 1,-1,1,-1,0,1};
void Search(int x,int y)
{
int ans=0;
for(int i=0;i<8;i++)
{
int a=x+dx[i],b=y+dy[i];
if(a>0 && a<=n && b>0 && b<=m &&Map[a][b]==-1)
ans++;
}
Map[x][y]=ans;
}
int main()
{
memset(Map,0,sizeof(Map));
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
char ch;
cin>>ch;
if(ch=='*') Map[i][j]=-1;
if(ch=='.') Map[i][j]=0;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(Map[i][j]==0)
Search(i,j);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(Map[i][j]==-1) cout<<'*';
else cout<<Map[i][j];
}
cout<<endl;
}
}