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的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...
随机推荐
- 以太坊虚拟机(EVM)
转载链接:https://ethfans.org/posts/solidity-chapter1-introduciton-to-smart-contracts 概括总览: 以太坊虚拟机(EVM)是以 ...
- C# 编码标准(一)
一直想写一个自己用的代码标准,经过一段时间的优秀开源源码的观察和看其他人写的标准,感觉好的代码给人感觉就是舒服,也非常重要.所以把它们记录归纳总结,以备以后忘记,另外平时写代码的时候可以拿来参考下.下 ...
- 阿里云oss视频上传不能在线播放,js,javascript,在线播放器,插件
网页视频播放插件 发现阿里云oss储存,上传了视频不能在线播放. 解决方法:使用插件播放即可解决. <html> <head> <meta charset="u ...
- asp.net微信支付发起页面jsapi.aspx
jsapi.aspx 后台核心代码 //创建支付应答对象 RequestHandler packageReqHandler = new RequestHandler(Context); //初始化 p ...
- Gym-101102-K-Topological Sort
K. Topological Sort 题面 Consider a directed graph G of N nodes and all edges (u→v) such that u < v ...
- (转)ASP.NET MVC 第五个预览版和表单提交场景
转自:http://ourlife.blog.51cto.com/708821/296171 上个星期四,ASP.NET MVC开发团队发布了ASP.NET MVC框架的“第五个预览版”.你可以在这里 ...
- MV人物抹去
填充为背景 Music Video is one type of Video Processing.视频剪辑反向复原:视频图像分类:TensorFlow图像分类教程 改起个什么名字 视频分类数据集 ...
- 团队博客--测试发布(队名:Running Duck)
代码链接:Tetris 码云地址 一.Alpha版本测试报告 1.测试计划 测试内容 1.方块生成下落 2.方块左右移动 3.方块快速下滑 4.本汉字替换 5.下一个汉字提示 6.方块颜色生成 7.汉 ...
- R12 AR INVOICE 接口表导入
http://blog.csdn.net/fangz0615/article/details/38677085 Purpose 本文介绍了如何通过AR接口表进行AR事务处理(亦称AR发票)导入. Ap ...
- node-webkit学习(3)Native UI API概览
node-webkit学习(3)Native UI API概览 文/玄魂 目录 node-webkit学习(3)Native UI API概览 前言 3.1 Native UI api概览 Exte ...