Description
扫雷游戏你一定玩过吧!现在给你若干个n×m的地雷阵,请你计算出每个矩阵中每个单元格相邻单元格内地雷的个数,每个单元格最多有8个相邻的单元格。 0<n,m<=100
Input
输入包含若干个矩阵,对于每个矩阵,第一行包含两个整数n和m,分别表示这个矩阵的行数和列数。接下来n行每行包含m个字符。安全区域用‘.’表示,有地雷区域用'*'表示。当n=m=0时输入结束。
Output
对于第i个矩阵,首先在单独的一行里打印序号:“Field #i:”,接下来的n行中,读入的'.'应被该位置周围的地雷数所代替。输出的每两个矩阵必须用一个空行隔开。
(注意两个矩阵之间应该有一个空行,由于oj的格式化这里不能显示出来)
Sample Input 1
4 4 *... .... .*.. .... 3 5 **... ..... .*... 0 0
Sample Output 1
Field #1: *100 2210 1*10 1110 Field #2: **100 33200 1*100
思路:
1. 通过雷区 给周围 8个相邻区域给贡献值的方式 ,同时给雷区打上标记 。
2.每个区都是 由 周围相邻的几个区 给的贡献值的叠加。
边输入边更新的方式 就得到答案
代码:
#include <iostream>
#include <string.h>
using namespace std;
int cnt;
char map[100][105][105];
int vis[105][105];
int n[100],m[100];
int k;
int dir[8][2]={{-1,0},{-1,1},{0,1},{1,1},
{1,0},{1,-1},{0,-1},{-1,-1}};
void blank(int q,int x,int y)
{
for(int i=0;i<8;i++)
{
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(nx>=0&&nx<n[q]&&ny>=0&&ny<m[q])
{
if(map[q][nx][ny]=='*') continue;
vis[nx][ny]++;
}
}
}
int main()
{
while(1)
{
cin>>n[k]>>m[k];
if(m[k]==0&&n[k]==0) break;
for(int i=0;i<n[k];i++)
for(int j=0;j<m[k];j++)
cin>>map[k][i][j];
k++;
}
for(int q=0;q<k;q++)
{
cnt++;
memset(vis,0,sizeof(vis));
for(int i=0;i<n[q];i++)
{
for(int j=0;j<m[q];j++)
{
if(map[q][i][j]=='*')
{
vis[i][j]=-1;
blank(q,i,j);
}
}
}
cout<<"Field #"<<cnt<<":"<<endl;
for(int i=0;i<n[q];i++)
{
for(int j=0;j<m[q];j++)
{
if(vis[i][j]==-1)
{
cout<<"*";
}
else
{
cout<<vis[i][j];
}
}
cout<<endl;
}
cout<<endl;
}
return 0;
}