题目链接:填色游戏
思路:从边缘出发,如果是 0 就 dfs 一下把和他相邻的 0 都给标记一下
在把剩下为0 的元素修改成 2 输出即可
用两个二维数组就可以实现
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
int a[50][50];
int b[50][50];
int pd(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=n&&a[x][y] == 0)
return 1;
return 0;
}
void dfs(int x,int y)
{
a[x][y] = 1;
if(pd(x-1,y))
dfs(x-1,y);
if(pd(x+1,y))
dfs(x+1,y);
if(pd(x,y+1))
dfs(x,y+1);
if(pd(x,y-1))
dfs(x,y-1);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
b[i][j] = a[i][j];
}
}
for(int i=1;i<=n;i++)
{
if(a[1][i] == 0)
dfs(1,i);
if(a[n][i] == 0)
dfs(n,i);
if(a[i][1] == 0)
dfs(i,1);
if(a[i][n] == 0)
dfs(i,n);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j] == 0)
b[i][j] = 2;
cout<<b[i][j]<<" ";
}
cout<<endl;
}
return 0;
}