题目链接:P1162
这个题是根据一个小技巧做出来的,因为题中只有1和0构成的方阵,我们只需要认真观察一下便会发现,只要我们找到1之后这个位置右下角必然是0,并且必然是闭合圈内的0,所以我们只需要根据这个0的位置求出这个0的连通块,给这个连通块都标上记号,输出就好了。
代码:
import java.io.*;
public class Main {
static int n;
static int a[][]; // 图
static boolean b[][]; // 是否访问过
static int xx[] = new int[]{1,-1,0,0};
static int yy[] = new int[]{0,0,-1,1};
static void dfs(int x,int y){
if(x<0 || x>=n || y<0 || y>=n)
return;
if(b[x][y])
return;
if(a[x][y] == 1)
return;
else{
b[x][y] = true;
for(int i = 0;i < 4;i++)
dfs(x+xx[i],y+yy[i]);
}
}
public static void main(String[] args) throws IOException{
StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
re.nextToken();
n = (int)re.nval;
a = new int[n][n];
int x = 0;
int y = 0;
boolean ok = false;
for(int i = 0;i < n;i++)
for(int j = 0;j < n;j++){
re.nextToken();
a[i][j] = (int)re.nval;
if(!ok && a[i][j] == 1 && j!=n-1){ // 找到第一个1将x y 改为 1右下的坐标 这个坐标必为圈内 0
x = i+1;
y = j+1;
ok = true;
}
}
b = new boolean[n][n];
for(int i = 0;i < n;i++)
for(int j = 0;j < n;j++)
b[i][j] = false;
dfs(x,y);
for(int i = 0;i < n;i++){
for(int j = 0;j < n-1;j++){
if(b[i][j])
System.out.print(2+" ");
else
System.out.print(a[i][j]+" ");
}
if(b[i][n-1])
System.out.print(2);
else
System.out.print(a[i][n-1]);
System.out.println();
}
}
}