欢迎点击「算法与编程之美」↑关注我们!

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

欢迎加入团队圈子!与作者面对面!直接点击!

问题描述

线性是人类少数研究得十分透彻的数学基础架构,上升到非线性的问题,我们并没有足够多的通用性质定理帮助解决问题。因此在面对一些“曲性”问题,我们常常“以直代曲”,将其划分成线性问题。而编程题中更是不乏此类,‘黑白皇后’便属其中:

1 例题

1.1 问题描述

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

1.2 输入格式

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

1.3 输出格式

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

解决方案

初见此题,第一想法是一行行设置判断,最终符合再输出。由于本人技术不行,未能成功。但在课程“线性代数”关于行列式的讲解中,突然发现展开行列式似乎能解决本题。

(1)先找一种皇后有多少放法:

先让我们回顾上题几个条件:1.不同列2.不同行3.不在斜线4.位置为‘0’不能放。而行列式的展开有个特点(不同行与不同列),而第三个条件:不在同一斜线,这个要用到斜率的知识——斜率的绝对值不能为1即可。最后一个条件:先找出‘0’的坐标(x,y),把含有此坐标的行列展开式删去即可。

(2)最后再找两种皇后的放法:

条件:两种皇后不能重合——即不含相同坐标。假设一种皇后有8种放法,将8种放法按2种为一组划分,且不含相同坐标的组合就能成功。

代码示例:

1 输入部分

import itertools

n=int(input())

b=[]

for i in range(n):

B=list(map(int,input().split(' ')))

b.append(B)

2 找缺失的坐标

c=[]

for i in range(n)

for ii in range(n):

if b[i][ii]==0:

c.append([i+1,ii+1])

3 列表展开式(此部分运行时间长)

a=list(range(1,n+1))

a=list(itertools.permutations(a)

for i in range(len(a)):

a[i]=list(a[i])

4 寻找能放下的列表展开式

s=[]

f=[]

for i in a:#寻找能放下的排列方式

i=list(i)

for ii in range(len(i)):

for iii in range(len(i)):

if ii!=iii:

g=(i[ii]-i[iii])/(ii+1-(iii+1))#斜率满足正负1就去掉

if g==1 or g==-1:

f.append(i)

break

for i in f:#去重

if i not in s:

s.append(i)

for i in s:

a.remove(i)

s=a

5 查找含有不能放棋的坐标

d=[]

for i in c:

for ii in s:

if ii[i[0]-1]==i[1]:

d.append(ii)

6 去掉不能放棋的展开式

for i in d:

if i in s:

s.remove(i)

else:

pass

7 寻找黑白皇后同时放下次数

m=0

for i in range(len(s)):#寻找两个不占相同位置的

k=s[i+1:]

if k!=[]:

v=0

for ii in range(len(k)):

for iii in range(n):

if s[i][iii]==k[ii][iii]:

v+=1

break

v=(len(s)-i-1)-v#与s[i]满足没占相同位置的列表数......即使含有s[i]的组合数

m+=v#最终累加

else:

print(m*2)#单组黑白皇后可以互换位置

break

结语

受线性代数课程启发,本题从行列式的角度出发得以解决,因此解题的思维并不难。‘天下难事必作于易,天下大事必作于细。’生活中小细节往往也有大作用,重视细节更是编写程序的严密逻辑的体现。而联系具有普遍性,往往重视事物之间的联系能为我们解决很多问题。也正是因为看到了行列式与上题的联系,这才得以成功解出。

END

主  编   |   王楠岚

责  编   |   梁   林

 where2go 团队


   

微信号:算法与编程之美

长按识别二维码关注我们!

温馨提示:点击页面右下角“写留言”发表评论,期待您的参与!期待您的转发!

Python|行列式解‘黑白皇后’相关推荐

  1. python input与返回值-Python 详解基本语法_函数_返回值

    Python 详解基本语法 概要: 函数的返回值是函数重要的组成部分.函数的根本在于实现程序的部分功能,所以很多时候我们需要将函数执行后的结果返回给程序再由程序作出进一步的操作.可以说是函数的返回值令 ...

  2. python选择排序从大到小_经典排序算法和Python详解之(一)选择排序和二元选择排序...

    本文源自微信公众号[Python编程和深度学习]原文链接:经典排序算法和Python详解之(一)选择排序和二元选择排序,欢迎扫码关注鸭! 扫它!扫它!扫它 排序算法是<数据结构与算法>中最 ...

  3. python批量解压文件_python 批量解压压缩文件的实例代码

    下面给大家介绍python 批量解压压缩文件的实例代码,代码如下所述: #/usr/bin/python#coding=utf-8import os,sys import zipfile open_p ...

  4. 详解Python序列解包(5)

    如果一个函数需要以多种形式来接收参数,定义时一般把位置参数放在最前面,然后是默认值参数,接下来是一个星号的可变长度参数,最后是两个星号的可变长度参数:调用函数时,一般也按照这个顺序进行参数传递.调用函 ...

  5. 详解Python序列解包(4)

    本文主要介绍调用函数传递参数时序列解包的用法.在定义函数时在形参前面加2个星号**表示可变长度参数,可以收集若干关键参数形式的参数传递并存放到一个字典之中.与之相对,如果实参是个字典,可以使用两个星号 ...

  6. 详解Python序列解包(3)

    本文主要介绍调用函数传递参数时序列解包的用法.在调用函数传递参数时,可以在实参序列前加一个星号*进行序列解包,或在实参字典前加两个星号**进行解包,本文介绍第一种用法,第二种用法后面再单独发文介绍. ...

  7. Python通过解压ofd文件获取发票信息

    Python通过解压ofd文件获取发票信息 实际上ofd.docx.xlsx等文件就是一个压缩文件,是可以被解压处理的.所以我们把一个ofd格式的发票文件解压后就可以看到它的目录,如下: 再用谷歌或者 ...

  8. 八皇后问题的进化(4)-python写的八皇后

    这是"Beginning Python From Novice to Professional"里用python写的八皇后,代码量很少,用到了生成器. python一直给我的感觉是 ...

  9. Python的解包知识

      在Python中的代码中经常会见到 *args 和 **kwargs.args 是 arguments 的缩写,*args表示位置参数:kwargs 是 keyword arguments 的缩写 ...

最新文章

  1. mobaxterm最多10个链接_短袖、纱裙、泳衣…百元左右夏季童装,我回购最多的10个品牌...
  2. 理解神经网络,从简单的例子开始(2)使用python建立多层神经网络
  3. java线程三种方法,Java基础_线程的使用及创建线程的三种方法
  4. c语言行列式源代码,新手作品:行列式计算C语言版
  5. windows server2008 IIS搭建网站简易教程(阿里云)
  6. arcgis api for python网盘_ArcGIS API for Python(2)
  7. hdu 2837 Calculation
  8. HTML5 本地存储之IndexedDB封装及最详细教程
  9. python 安卓库_python 库实战 - 安卓简易自动化框架
  10. vue-json-editor高度调整
  11. 计算机专业对未来职业的理想追求,IT行业个人职业生涯规划
  12. 小米路由器管理员密码爆破!
  13. QT报错 error: [debug/qrc_image.cpp] Error 1
  14. 爱康科技压力大:前三季亏损1.2亿,中泰证券喊话全年净利3.92亿
  15. Putty 下载安装
  16. Android Binder机制学习总结(二)-Driver部分
  17. Gravity 介绍
  18. 为什么不建议你吃精致碳水,这里有你需要的答案
  19. latex中biblatex参考文献的标点、分隔符、本地化字符串中英文切换
  20. 破冰船是怎么破冰的?和你想到一点不一样,6米高的冰墙直接就撞

热门文章

  1. WebRTC PeerConnection Client源码分析3-Conductor
  2. 语聊房高质量音乐伴奏的实现
  3. @Documented:
  4. 现在的情况是创业项目满天飞,挣钱的路子很多
  5. mininet topology
  6. 第003话 收服宝可梦吧!(蜜汁模拟)
  7. Photoshop婚纱影楼调色自学教程
  8. Vue依赖注入provide函数
  9. 设计模式之动态代理模式
  10. 怎样清理手机内存空间