洛谷P1162填涂颜色

【题目描述】
由数字0组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成2.例如:6 6×6的方阵(n=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
输入格式
每组测试数据第一行一个整数n(1≤n≤30)

接下来n行,由0和1组成的n×n的方阵。

方阵内只有一个闭合圈,圈内至少有一个0。

输出格式
已经填好数字2的完整方阵。

输入输出样例
输入
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

先上代码:

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
		static int[][]vis = new int[40][40];
		static int [][]map = new int[40][40];
		static Queue qx = new LinkedList(); 
		static Queue qy = new LinkedList(); 
		static int []dx = {1,0,-1,0};
		static int []dy = {0,1,0,-1};
		static int n;
		public static boolean inmap(int x,int y)
		{
			return(x>=0&&x<=n+1&&y>=0&&y<=n+1);
		}
		public static void bfs(int x,int y)
		{
			while(!qx.isEmpty())//不为空的状态下
			{
				for (int i = 0; i < 4; i++) {
					int xx = qx.peek()+dx[i];
					int yy = qy.peek()+dy[i];
					if(inmap(xx,yy)&&vis[xx][yy]!=1&&map[xx][yy]!=1)
					{
						qx.offer(xx);
						qy.offer(yy);
						vis[xx][yy] = 1;
					}
				}
				qx.poll();
				qy.poll();
			}
		}
		public static void main(String[] args) {
				Scanner s = new Scanner(System.in);
				n = s.nextInt();
				for (int i = 1; i <= n; i++) {
					for (int j = 1; j <= n; j++) {
						map[i][j] = s.nextInt();
					}
				}
				qx.offer(0);
				qy.offer(0);
				vis[0][0] = 1;//标记这个点已经走过
				bfs(0,0);
				for (int i = 1; i <= n; i++) {
					for (int j = 1; j <= n; j++) {
						if(vis[i][j]==0&&map[i][j]==0)
						{
							System.out.print(2+" ");
						}
						else
						{
							System.out.print(map[i][j]+" ");
						}
					}
					System.out.println();
				}
	}

}

你可能感兴趣的:(洛谷P1162填涂颜色)