BASIC-27 基础练习 2n皇后问题

题目描述

给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。 

输入

输入的第一行为一个整数n,表示棋盘的大小。 n小于等于8

接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。 

输出

输出一个整数,表示总共有多少种放法。 

样例输入

4
1 1 1 1 
1 1 1 1 
1 1 1 1 
1 1 1 1 

样例输出

2

解决:递归寻找位置

先递归求解黑皇后的放置位置,再在其基础上放置白皇后。

递归算法参考 8皇后递归算法 https://zhuanlan.zhihu.com/p/99209213

n = int(input())
cb = []    # 棋盘
for i in range(n):
    l = [int(i) for i in input().split()]
    cb.append(l)
    
counter = 0    # 计数成功摆放次数

def check(row, col, queen):    
    place = cb[row][col]
    if place==0 or place==(0-queen):    # 棋盘不可放置 or 放置了另一种皇后
        return False
    for k in range(n):  # 检查是否有同列
        if cb[k][col] == queen:
            return False
    for i, j in zip(range(row-1, -1, -1), range(col-1, -1, -1)):    # 检查主对角线
        if cb[i][j]==queen:
            return False
    for i, j in zip(range(row-1, -1, -1), range(col+1, n)):    # 检查负对角线
        if cb[i][j]==queen:
            return False
    return True
    

def find_queen(row, queen):
    if row >= n:
        if queen==2:    # 黑皇后求解成功,则继续求解白皇后
            find_queen(0, 0-queen)
        else:    # 白皇后求解成功,即找到一组新的解
            global counter  # 声明引用的是全局变量counter
            counter += 1
        return
    for col in range(n):
        if check(row, col, queen):
            cb[row][col] = queen
            find_queen(row+1, queen)
            cb[row][col] = 1

find_queen(0, 2)    # 先求解黑皇后(2),再求解白皇后(-2)
print(counter)

参考:8皇后递归算法 https://zhuanlan.zhihu.com/p/99209213

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
instantclient-basic-w是Oracle提供的一个软件包,用于在Windows操作系统上运行Oracle数据库客户端应用程序。它是Oracle Instant Client系列中的一个成员,旨在简化和加速Oracle数据库的部署和连接过程。 instantclient-basic-w包含了Oracle客户端应用程序所需的基本组件,包括:OCI(Oracle Call Interface)库、SQL*Plus命令行工具、创建Oracle数据库连接的必要配置文件以及一些辅助工具等。使用这个软件包可以方便地在Windows系统上进行Oracle数据库的连接、数据查询、事务处理等各种数据库操作。 与其他Oracle数据库客户端软件相比,instantclient-basic-w具有以下几个优点: 1. 简化部署:使用这个软件包可以避免繁琐的安装过程,只需要解压缩即可安装使用。无需安装整个Oracle数据库软件,减少了部署和维护的成本和工作量。 2. 轻量级:instantclient-basic-w只包含了必要的组件,不占用过多的系统资源,适合在较低配置的Windows计算机上运行。 3. 高性能:OCI库是Oracle数据库的核心部分,通过使用这个库,可以获得较高的数据库访问性能和效率。 4. 兼容性好:instantclient-basic-w与其他Oracle数据库客户端软件兼容性良好,可以与Oracle数据库的不同版本进行连接和通信。 5. 简单易用:SQL*Plus命令行工具提供了一个交互式的界面,使用户可以方便地输入和执行SQL语句,对数据库进行管理和查询。 总之,instantclient-basic-w是一个方便、高效、易用的Oracle数据库客户端软件包,为在Windows系统上进行Oracle数据库操作提供了便利和支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44645726

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值