题目描述
扫雷是一个经典的游戏,在一个N*M区域中
输入一个N*M的雷区中的k个雷坐标,打印出所有雷区的分布
一个位置如果是雷则表示为*,否则应该是0~8,表示他周围八连通域中的地雷总数。
输入
雷区尺寸 3=<n m="" <="20"
地雷数目 k<=M*N
和他们的坐标xi,yi
输出
雷区的分布
每组后空一行
样例输入
3 3 1 1 1 4 4 2 1 2 2 3
样例输出
111 1*1 111 0111 01*2 012* 0011
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
int a,b,c,x1=0,x2=0,s[200][200];
while(~scanf("%d%d%d",&a,&b,&c))
{
//int s[a][b];//此题不能在这里定义数组,因为后面判定雷周围的数时会越界
//并且二维数组读到最后会返回开始的一边(头边)继续读,但是
//头边越界则不会从尾边继续读(被wa了好多次,一直在找问题所在)
//memset(s,0,sizeof(s)); //二维数组的初始化为0
for(int i=0;i<a;i++) //循环初始化
{
for(int j=0;j<b;j++)
{
s[i][j]=0;
}
}
for(int k=0;k<c;k++)
{
scanf("%d%d",&x1,&x2);
s[x1][x2]=-1;
}
for(int l=0;l<a;l++)
for(int m=0;m<b;m++)
{
if(s[l][m]!=-1)
{
if(s[l-1][m-1]<0) s[l][m]++;
if(s[l-1][m]<0) s[l][m]++;
if(s[l-1][m+1]<0) s[l][m]++;
if(s[l][m-1]<0) s[l][m]++;
if(s[l][m+1]<0) s[l][m]++;
if(s[l+1][m-1]<0) s[l][m]++;
if(s[l+1][m]<0) s[l][m]++;
if(s[l+1][m+1]<0) s[l][m]++;
}
}
for(int i=0; i<a; i++)
{
for(int j=0; j<b; j++)
if(s[i][j]<0)cout<<"*";
else cout<<s[i][j];
cout<<endl;
}
cout<<endl;
}
/*for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
printf("%d ",s[i][j]);
}
printf("\n");
}
}*/
}