P1162 填涂颜色
//https://www.luogu.com.cn/problem/P1162?contestId=96615
//DFS搜外圈的0
//注意要行和列要多增加一个维度取剔除一种情况就是边界就是n维,这样可以保证外圈的0总是连续的
//MLE
#include<bits/stdc++.h>
using namespace std;
int n;
int arr[50][50];
int visit[50][50];
void dfs(int x,int y)
{
//一般矩阵走路问题都需借助坐标
//一定是对原图的操作!!!每次操作都在visit的遍历上,因为递归里是修改visit[x][y]的值
if(x<0 || y<0 || x>n+1 || y>n+1 || visit[x][y]!=0)
{
return;
}
visit[x][y]=3;
dfs(x-1,y);//向上深搜
dfs(x+1,y);//向下深搜
dfs(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",&arr[i][j]);
visit[i][j]=arr[i][j];
}
dfs(0,0);//必须从0.0开始深搜保证外层的零是连续的
for(int i=1;i<=n;i++)
{
for (int j=1; j<=n;j++)
{
if (visit[i][j] == 3)
printf("0 ");
if (visit[i][j] == 1)
printf("1 ");
if (visit[i][j] == 0)
printf("2 ");
}
printf("\n");
}
return 0;
}

