题目:
测试样例:
输入
6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
输出
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1
1<=n<=30
思路
这道题的目的是将里面0换成2,那么如何区分里面的0和外面的0是关键。
如果要找到被围起来的0,那么必然经过1,所以我们只要用条件限制好不经过1,就可以绕过被围起来的0。
然后把没有围起来的0标记好,就可以把特定的0标记为2了。
代码
package 搜索;
import java.util.Scanner;
public class P1162填涂颜色 {
static int n;
static int a[]={0,1,0,-1};
static int b[]={1,0,-1,0};
static boolean map[][]=new boolean[40][40];//标记没有被围起来的0
static int ans[][]=new int[40][40];//方阵外面围了一圈0
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
for (int i = 0; i <= n+1; i++) {
for (int j = 0; j <= n+1; j++) {
if (i==0||j==0||i==n+1||j==n+1)//把方阵围起来
ans[i][j]=0;
else
ans[i][j]=sc.nextInt();
}
}
dfs(0,0);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (!map[i][j]&&ans[i][j]!=1)//当没有标记且又不是数字1时
System.out.print(2+" ");
else
System.out.print(ans[i][j]+" ");
}
System.out.println();
}
}
public static void dfs(int x,int y){
//当越界或碰到数字1或已经标记过时返回
if(x<0||x>n+1||y<0||y>n+1||ans[x][y]==1||map[x][y]==true){
return;
}
map[x][y]=true;//标记
for (int i = 0; i < 4; i++) {
dfs(x+a[i],y+b[i]);
}
}
}