填涂颜色
题目描述
由数字 0 0 0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 1 1 1 构成,围圈时只走上下左右 4 4 4 个方向。现要求把闭合圈内的所有空间都填写成 2 2 2。例如: 6 × 6 6\times 6 6×6 的方阵( n = 6 n=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(1 \le n \le 30) n(1≤n≤30)。
接下来 n n n 行,由 0 0 0 和 1 1 1 组成的 n × n n \times n n×n 的方阵。
方阵内只有一个闭合圈,圈内至少有一个 0 0 0。
输出格式
已经填好数字 2 2 2 的完整方阵。
样例 #1
样例输入 #1
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
样例输出 #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
提示
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 30 1 \le n \le 30 1≤n≤30。
题解
这道题我是直接看题解来写的,由于没有人写的是python代码所以时间主要花在实现DFS in python 上,大概思路比较简单,就是:
-
读入数据记为
a
数组 -
设置
vis
数组,用于记录遍历过的点:vis[x][y] =1
代表遍历过 -
DFS开始的点放置在最外层每一个点(如果
vis[x][y] !=1 and a[x][y] !=1
),开始深度优先搜索 -
最后如果:
vis[x][y] ==1 and a[x][y] !=1
: 打印0
-
a
[
x
]
[
y
]
=
=
1
a[x][y] ==1
a[x][y]==1:打印
1
vis[x][y] ==0 and a[x][y] !=1
:打印2
n = int(input())
a = [[0 for j in range(n)] for i in range(n)]
vis = [[0 for j in range(n)] for i in range(n)]
def read():
for i in range(n):
x = list(map(int,input().split()))
for j in range(n):
a[i][j]=x[j]
def dfs(x,y):
if x<0 or x>=n or y <0 or y>=n or a[x][y]==1 or vis[x][y] ==1:
return
vis[x][y] = 1
dfs(x+1,y)
dfs(x-1,y)
dfs(x,y+1)
dfs(x,y-1)
def solve():
read()
# print(a)
for i in range(n):
if vis[i][0]==0 and a[i][0]!=1:
dfs(i,0)
if vis[i][n-1]==0 and a[i][n-1] !=1:
dfs(i,n-1)
for i in range(n):
if vis[0][i]==0 and a[0][i]!=1:
dfs(1,i)
if vis[n-1][i]==0 and a[n-1][i] !=1:
dfs(n-1,i)
# print(vis)
for i in range(n):
for j in range(n):
if a[i][j]==0 and vis[i][j] == 1:
print(0,end=' ')
elif a[i][j] == 1:
print(1,end=' ')
elif a[i][j]==0 and vis[i][j] == 0:
print(2,end=' ')
print('')
solve()