全排列问题
按照字典序输出自然数 1 1 1 到 n n n 所有不重复的排列,即 n n n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式
一个整数 n n n。
输出格式
由 1 ∼ n 1 \sim n 1∼n 组成的所有不重复的数字序列,每行一个序列。
每个数字保留 5 5 5 个场宽。
样例输入
3
样例输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
提示
1 ≤ n ≤ 9 1 \leq n \leq 9 1≤n≤9。
解题思路:
代码:
python
"""
"""
n = int(input())
x = [0] * (n + 1) # 1-n
vis = [0] * (n + 1) # 标记
d = [0] * (n + 1) # 当前排列的数组
for i in range(1, n + 1):
x[i] = i
def dfs(step):
if step == n + 1:# 如果长度已经最大,则输入当前的序列 d
for i in range(1, n + 1):
print('%5d'%d[i],end='')
print()
return
for i in range(1, n + 1):
if vis[i] == 0: # 如果该标记为0,则认为还没有走过这歌分支
d[step] = x[i]
vis[i] = 1 # 将该位置标记为1,后续暂时不走(保留现场)
dfs(step + 1) # 继续走下一步
vis[i] = 0 # 恢复现场,后续可以继续使用
return
dfs(1)
最大连通
题目链接:最大连通(蓝桥)
解题思路 :
定义四个方向,x和y的,然后开始寻找,如果当前值为0,那么返回0,表示走不通。如果是1的话,将当前的元素置为0,表示已经走过,然后依次寻找四个方向,继续做深度优先遍历。如果遇到边界情况要进行判断,之后进行累加连通的块数即可。
python
n, m = 30, 60
# dx, dy为四个方向
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
def dfs(x, y):
if g[x][y] == '0': return 0 # 如果为0,则该地方走不通
g[x][y] = '0'
cnt = 1 #记录连通分块数
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or nx >= n or ny < 0 or ny >= m: continue
cnt += dfs(nx, ny)
return cnt
# 获取输入
g = list()
for i in range(n):
g.append(list(input().strip()))
print(g)
ans = 0
for i in range(n):
for j in range(m):
if g[i][j] == '1':
ans = max(ans, dfs(i, j))
print(ans)