洛谷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<Integer> qx = new LinkedList<Integer>();
static Queue<Integer> qy = new LinkedList<Integer>();
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();
}
}
}
作者:Better又
出处:https://www.cnblogs.com/lwyy1223-/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。