P1162 填涂顏色
//https://www.luogu.com.cn/problem/P1162?contestId=96615
//DFS搜外圈的0
//注意要行和列要多增加一個維度取剔除一種情況就是邊界就是n維,這樣可以保證外圈的0總是連續(xù)的
//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開始深搜保證外層的零是連續(xù)的
? ?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;
}