首页 > 编程语言 >蓝桥杯备战日志(Python)20-受伤的皇后-(矩阵搜索、递归)

蓝桥杯备战日志(Python)20-受伤的皇后-(矩阵搜索、递归)

时间:2023-03-01 22:33:10浏览次数:53  
标签:ii 20 Python 象棋 摆放 蓝桥 放置 put 皇后

原题

有一个 蓝桥杯备战日志(Python)20-受伤的皇后-(矩阵搜索、递归)_递归方法 的国际象棋棋盘(蓝桥杯备战日志(Python)20-受伤的皇后-(矩阵搜索、递归)_递归方法_02 行 蓝桥杯备战日志(Python)20-受伤的皇后-(矩阵搜索、递归)_递归方法_02 列的方格图),请在棋盘中摆放 蓝桥杯备战日志(Python)20-受伤的皇后-(矩阵搜索、递归)_递归方法_02 个受伤的国际象棋皇后,要求:

  1. 任何两个皇后不在同一行。
  2. 任何两个皇后不在同一列。
  3. 如果两个皇后在同一条 45 度角的斜线上,这两个皇后之间行号的差值至少为 3 。

请问一共有多少种摆放方案。

蓝桥杯备战日志(Python)20-受伤的皇后-(矩阵搜索、递归)_搜索_05

分析

本题考查搜索,一般这种涉及“矩阵”的搜索使用递归方法会更直观、简便。在一个n*n的棋盘上放置“皇后”象棋,首先考虑第一个条件:同一行的所有格子只能摆放在其中一个摆放棋子,所以可以一行一行的放,即先按行进行放置方案的“搜索”。“搜索”的实现如下:

  • 首先在第i行中选择其中的第j个格子放置一个象棋(i,j=0,1,2,...,n-1)
  • 然后在第i+1行放置象棋,准备放在第j_new个格子(j_new=0,1,2,...,n-1),放置之前,需要判断这个格子是否可以放置
  • 判断当前格子是否可以放置的依据:是否满足题意中的后两个条件
  • 当i = n-1,即最后一行已经放置象棋,此时整个棋盘的象棋的摆放即为所“搜索”的一种方案


源码


n = int(input())
An_l = [ [0]*n for _ in range(n)] #表示棋盘的n*n的矩阵

count = 0

def is_can_put(i,j):
'''判断(i,j)位置是否可以摆放皇后'''
# 同一条 45 度角的斜线上,这两个皇后之间行号的差值至少为 3
for ii,jj in [ (i-1,j-1),(i-2,j-2),(i-1,j+1),(i-2,j+2) ]:
if ii >=0 and ii < n and jj >= 0 and jj < n:
if An_l[ii][jj] == 1:
return False
# 同一列不能放置
for ii in range(i):
if An_l[ii][j] == 1:
return False
return True

def put(i,j):
global count
if i == n-1: # 最后一行已放置
# print(An_l)
count += 1
return

i += 1
for j in range(n):
if is_can_put(i,j):
An_l[i][j] = 1
put(i,j)
An_l[i][j] = 0


for j in range(n):
An_l[0][j] = 1 # 第0行的第j列放置皇后
put(0,j)
An_l[0][j] = 0 # 拿掉皇后,回溯

print(count)


上一篇:​​蓝桥杯备战日志(Python)19-阅兵方阵&删除字符-(平方和频次统计&字符串字典序)​


标签:ii,20,Python,象棋,摆放,蓝桥,放置,put,皇后
From: https://blog.51cto.com/gpnuCITlabCar/6094361

相关文章

  • python 字符串 格式化输出 位置槽 无序号的槽
    """需要格式化输出内容时可以先定义好格式使用槽{}先进行占位然后再往槽中填入数据"""print("槽的使用演练:无编号位置槽")print("首先定义一个格式")fmt="大家好,我叫{},......
  • python创建类的两种方式和类由自定义type创建
    (1)第一种:直接创建1classFoo(object,metaclass=type):2def__init__(self):3print("我执行了")4super().__init__()56deftest(......
  • python之路 79 路飞项目、导出项目依赖、问题、前台主页功能、前台轮播图功能完成、g
    补充视图类中:通过重写get_serializer,达到不同方法使用的序列化类不一样通过重写get_queryset,达到不同方法使用的数据不一样通过重写perform_d......
  • 每日总结2023/3/1
    今天学习了AndroidStudio对于昨日的错误找到了对应的解决方案没有在前面设置时间监听器,所以无法触发R.id事件 今日学习了链接本地数据库,成果   对于图一,代码......
  • 2018GPLT (天梯赛训练03-01)
    2018GPLT (天梯赛训练03-01)1.天梯赛座位分配这题在网上都没找到篇靠谱的解答很多都是错的(可能但凡会点编程的人都不会被这题卡住了吧)(悲)从我的好朋友毛的程序我觉得......
  • 2023.3.1每日总结
    packagecom.example.myapplication;importandroidx.appcompat.app.AppCompatActivity;importandroid.content.ContentValues;importandroid.database.sqlite.S......
  • LOJ 3276 JOISC 2020 Day2 遗迹 题解 (计数DP)
    LOJ链接UOJ链接观察一下n次地震的过程,发现最后会有n个石柱高度为0,\(1,2\cdotsn\)高度的石柱各有一个。假设现在已经确定了一种初始高度状态,我们来看看最后哪些石柱高度......
  • day01(2023.3.1)
    1、了解了Java运行机制jdk和jre和jvm的区别 2、下载安装jdk然后配置环境变量 并验证是否成功(1)百度收搜Jdk8(推荐),找到下载地址。(2)同意协议,下载电脑对应的版本。......
  • 又更新了 20 道 TS 练习题,你能答对几道?
    中秋假期已经结束了,由于疫情原因阿宝哥在家里待了三天,期间精选了 20 道新的TS练习题,目前已经有 30 道题了。很多小伙伴已提交了他们心目中的答案,撸过TS的小伙伴赶......
  • 2023/2/27每日总结
    以下为今日课上所写代码packageText;importjava.io.*;importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;/*关于文件导入并找出最长的接龙单......