8皇后问题(c++/python实现)
问题描述:在8*8的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任何两个皇后都不能处于同一行、同一列或者同一斜线上,问有多少种摆法。
算法分析:
利用3个数组分表来标记冲突,数组a、b、c。
a数组代表列冲突,a[0]~a[7]代表0~7列,如果a[0]=1,则表示第0列已有皇后。
b数组带表主对角线冲突,为b[行-列+7],即b[0]~b[14]中如果为1,表示该主对角线有皇后(如下图)。
c数组带表从对角线冲突,为c[行+列],即c[0]~c[14]中如果为1,表示该从对角线有皇后(如下图)。

c++实现如下:
#include <iostream> using namespace std; static char Queen[][];
static int a[];
static int b[];
static int c[];
static int iQueenNum=; //记录总的棋盘状态数 void qu(int i);//第i行 int main()
{
int iLine,iColumn;
for(iLine=;iLine<;iLine++)//初始化棋盘为‘*’
{
a[iLine]=;//列标记初始化,表示无列冲突
for(iColumn=;iColumn<;iColumn++)
{
Queen[iLine][iColumn]='*';
}
}
//主、从对角线标记初始化,表示没有冲突
for(iLine=;iLine<;iLine++)
{
b[iLine]=c[iLine]=;
}
qu();
return ;
} void qu(int i)
{
int iColumn;
for(iColumn=;iColumn<;iColumn++)
{
if(a[iColumn]==&&b[i-iColumn+]==&&c[i+iColumn]==)
{
Queen[i][iColumn]='@';//放皇后
a[iColumn]=;//标记,下一次该列上下不能放皇后
b[i-iColumn+]=;//标记,下一次该主对角线上下不能放皇后
c[i+iColumn]=;//标记,下一次该从对角线上下不能放皇后
if(i<)qu(i+);//如果行还没有遍历完,进入下一行
else//否则输出
{
//输出棋盘状态
int iLine,iColumn;
cout<<"第"<<++iQueenNum<<"种状态为:"<<endl;
for(iLine=;iLine<;iLine++)
{
for(iColumn=;iColumn<;iColumn++)
{
cout<<Queen[iLine][iColumn];
}
cout<<endl;
}
cout<<endl;
}
//如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重置
Queen[i][iColumn]='*';
a[iColumn]=;
b[i-iColumn+]=;
c[i+iColumn]=;
}
}
}
python实现如下:
#-*- coding:utf-8 -*- global Queue,a,b,c,queenNum
Queue=[['*' for i in range(0,8)] for i in range(0,8)]
a=[0 for i in range(0,8)]
b=[0 for i in range(0,15)]
c=[0 for i in range(0,15)]
queenNum=0
'''
Queue表示整个棋盘
a表示列的冲突
b表示正对角冲突
c表示从对角冲突
queenNum表示第几种摆法
''' def fun(num):
global Queue, a, b, c, queenNum
for icolumn in range(0,8): #总共8行
if a[icolumn]==0 and b[num-icolumn+7]==0 and c[num+icolumn]==0: #满足3个条件
Queue[num][icolumn]='@'
a[icolumn]=1 #该列不能放入皇后
b[num-icolumn+7]=1 #该正列不能放入皇后
c[num+icolumn]=1 #该从列不能放入皇后
if num<7:
fun(num+1)
else: #7行放满了,输出
queenNum+=1
print '第%d种情况:'%queenNum
for j in range(0,8):
print ' '.join(Queue[j])
print '\n'
#回溯
Queue[num][icolumn]='*'
a[icolumn]=0
b[num-icolumn+7]=0
c[num+icolumn]=0
if __name__=='__main__':
fun(0)
8皇后问题(c++/python实现)的更多相关文章
- 八皇后问题的Python实现和C#实现
看到八皇后问题的解决思路, 感觉很喜欢. 我用C#实现的版本之前贴在了百度百科上(https://baike.baidu.com/item/%E5%85%AB%E7%9A%87%E5%90%8E%E9 ...
- N皇后问题的python实现
数据结构中常见的问题,最近复习到了,用python做一遍. # 检测(x,y)这个位置是否合法(不会被其他皇后攻击到) def is_attack(queue, x, y): for i in ran ...
- 面试基础知识集合(python、计算机网络、操作系统、数据结构、数据库等杂记)
python python _.__.__xx__之间的差别 python中range.xrange和randrange的区别 python中 =.copy.deepcopy的差别 python 继承 ...
- Python学习二(生成器和八皇后算法)
看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...
- Python解决八皇后问题
最近看Python看得都不用tab键了,哈哈.今天看了一个经典问题--八皇后问题,说实话,以前学C.C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的 ...
- 八皇后,回溯与递归(Python实现)
八皇后问题是十九世纪著名的数学家高斯1850年提出 .以下为python语句的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩 ...
- 【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)
八皇后问题是一道经典的回溯问题.问题描述如下:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉? 看到这个问题,最容易想 ...
- Python 八皇后问题
八皇后问题描述:在一个8✖️8的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解法. 规则分析: 任意两个棋子不能在同一行比较好办,设置一个队列,队列里的每个元 ...
- 【算法】八皇后问题 Python实现
[八皇后问题] 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...
随机推荐
- 线性回归,多项式回归(P2)
回归问题 回归问题包含有线性回归和多项式回归 简单来说,线性回归就是用多元一次方程拟合数据,多项式回归是用多元多次来拟合方程 在几何意义上看,线性回归拟合出的是直线,平面.多项式拟合出来的是曲线,曲面 ...
- 简单MVC实现增删改查
反射工具类RelfectionUtils package Utils; import java.lang.reflect.Field; import java.lang.reflect.Invocat ...
- 18) maven 项目结构:继承
Project Inheritance [ɪn'herɪt(ə)ns] https://maven.apache.org/guides/introduction/introduction-to-the ...
- 1.7.8使用return 停止线程
package com.cky.thread; /** * Created by edison on 2017/12/3. */ public class MyThread12 extends Thr ...
- Ng第十四课:降维(Dimensionality Reduction)
14.1 动机一:数据压缩 14.2 动机二:数据可视化 14.3 主成分分析问题 14.4 主成分分析算法 14.5 选择主成分的数量 14.6 重建的压缩表示 14.7 主成分分析法 ...
- 属性动画和Activity、Fragment过渡动画等
主题是关于动画的,但是不是什么动画的内容都包括.先泛泛的介绍一下,然后详细的介绍一下翻代码找见的一个好玩的动画的使用.以下的内容包括Android 3和Android 3.1等引入的API,在使用中请 ...
- .net MongoDB使用
.net平台的MongoDB使用 CRL快速开发框架系列教程十二(MongoDB支持) MongoDB数据库 mongo-csharp-driver
- springmvc配置文件web.xml详解各方总结。
Spring分为多个文件进行分别的配置,其中在servlet-name中如果没有指定init-param属性,那么系统自动寻找的spring配置文件为[servlet-name]-servlet.xm ...
- c# file 上传EXCEL文件,以流的形式读取数据
1.引入 Aspose.Cells public void test() { HttpFileCollection filelist = HttpContext.Current.Request.Fi ...
- ServiceStack 错误处理
抛出C#异常 在大多数情况下,您不需要关心ServiceStack的错误处理,因为它为抛出C#异常的正常用例提供本机支持,例如: public object Post(User request) { ...