DFS: 842. 排列数字

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值