文章目录
842. 排列数字
给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
输入格式
共一行,包含一个整数 n。
输出格式
按字典序输出所有排列方案,每个方案占一行。
数据范围
1≤n≤7
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
思路:用DFS暴力枚举
递归出口:当字符长度为n时,弹栈
代码:
N = int(input())
path = [0]*N
flag = [True]*N
def recur(n):
if n == N:
print(' '.join([str(j) for j in path]))
return
for i in range(len(flag)):
if flag[i] ==True:
path[n] = i+1
flag[i] = False
recur(n+1)
flag[i] = True
recur(0)
843. n-皇后问题
n− 皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
现在给定整数 n,请你输出所有的满足条件的棋子摆法。
输入格式
共一行,包含整数 n。
输出格式
每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。
其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。
每个方案输出完成后,输出一个空行。
注意:行末不能有多余空格。
输出方案的顺序任意,只要不重复且没有遗漏即可。
数据范围
1≤n≤9
输入样例:
4
输出样例:
.Q..
...Q
Q...
..Q.
..Q.
Q...
...Q
.Q..
思路:其实可以类比成全排列问题,不需要用二维数组,一维即可。每个空位中的值保存的是列数,而Index表示的是行数。因为按照全排列的思路,每一个列数必然不同。这也省去了判断是否皇后在同一列的可能,而每一个Index表示行数,也意味着皇后不可能在同一行。所以只需要考虑皇后是否在同一斜线上即可。
如:
..Q.
Q...
...Q
.Q..
可以表示为
checker: 2 4 1 3
代码:
N = int(input())+1
# 序号代表第几行,里面的值代表第几列,这种操作注定不会发生行重合
checker = [0]*N
flag = [True]*N
def check(x,n):
for ck in range(1,n): #从1开始,到当前位置的前一个位置 进行校对
if abs((ck - n)/(checker[ck] - x)) == 1 : #对角线重合
return False
return True
def putout():
for i in range(1,len(checker)):
for j in range(1,len(checker)):
if j == checker[i]:
print('Q',end = '')
else:
print('.',end = '')
print('')
print('')
# n = 层数
def Dfs(n):
# 递归出口
if(n == N):
return
for i in range(1,N): # i列数
if flag[i] == True:
flag[i] = False
checker[n] = i
if check(i,n) == False: # 剪枝
flag[i] = True #剪枝后提前恢复现场
continue
if(n == N-1):
putout()
Dfs(n+1)
flag[i] = True
Dfs(1)