题意:扫雷问题,不同的是这个有雷区域的外面也有一圈
思路:从第一行第一列开始,如果它右下角是1,那么这个点就有雷,标记一下这个点,然后把它周围3*3的区域都减去1,最后遍历一遍h*w的区域,如果都是0,那么输出h*w的图,否则输出impossible
#include<algorithm>
#include <cstdio>
#include <iostream>
#define maxn 150
using namespace std;
typedef long long ll;
int mp[maxn][maxn];
int vis[maxn][maxn];
int main()
{
int h,w;
scanf("%d %d",&h,&w);
for(int i=0;i<=h+1;i++)
{
for(int j=0;j<=w+1;j++)
{
scanf("%d",&mp[i][j]);
}
}
int flag=1;
for(int i=1;i<=h;i++)
{
for(int j=1;j<=w;j++)
{
if(mp[i-1][j-1]==1)
{
//printf("i=%d j=%d\n",i,j);
vis[i][j]=1;
for(int i1=i-1;i1<=i+1;i1++)
{
for(int j1=j-1;j1<=j+1;j1++)
{
mp[i1][j1]--;
}
}
}
}
}
for(int i=0;i<=h+1;i++)
{
for(int j=0;j<=w+1;j++)
{
if(mp[i][j]!=0) flag=0;
}
}
if(flag==0)
{
printf("impossible\n");
return 0;
}
for(int i=1;i<=h;i++)
{
for(int j=1;j<=w;j++)
{
if(j==w)
{
if(vis[i][j]==1)
{
printf("X\n");
}
else printf(".\n");
}
else
{
if(vis[i][j]==1)
{
printf("X");
}
else printf(".");
}
}
}
}
/*
1 2
0 0 1 1
0 1 1 1
0 1 1 1
*/