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的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...
随机推荐
- flex 布局 计算器
flex布局计算器 <!doctype html> <html> <head> <style> .box{ display: flex; flex-di ...
- (转载)Fiddler调式使用知多少(一)深入研究
原文来源于:http://www.cnblogs.com/tugenhua0707/p/4623317.html,作者:涂根华 !个人觉得原作者写的特别好,故收藏于此 Fiddler调式使用(一)深入 ...
- java调用执行cmd指令启动weblogic
这里的例子是启动weblogic import java.io.BufferedReader; import java.io.IOException; import java.io.InputStre ...
- 把sublime text打造成python交互终端(windows和Ubuntu)
作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7015958.html 把sublime text打造成python交互终端 ...
- Shell编程-12-Shell脚本规范及调试
目录 Shell脚本规范 Shell脚本调试 Shell脚本规范 良好的代码规范不仅方便阅读,也利于维护和提升开发效率.因此建议大家在编写Shell脚本时养成良好的代码习惯.今天就和大家探讨一 ...
- js获取标签下标
<body> <div class="titTab"> <span>低</span> <span>中</span& ...
- web-day9
第9章WEB09-Servlet篇 今日任务 完成系统的登录的功能 完成登录系统后页面定时跳转 记录系统登录成功后,系统被访问多少次 教学导航 教学目标 了解HTTP协议 掌握Servlet的编写 了 ...
- C#、.Net经典面试题目及答案
1 请你说说 .NET 中类和结构的区别? 答:结构和类具有大体的语法,但是结构受到的限制比类要多.结构不能申明有默认的构造函数,为结构的副本是又编译器创建 和销毁的,所以不需要默认的构造函数和 ...
- 第K大01背包
其实这个问题,真的挺好想的,但是我咋想了那么久呢~~ 很好理解,第K大01背包一定基于01背包,dp数组也很容易的想到由dp[V] ----> dp[V][K],来表示背包容量是V时候的第 ...
- AngularJS 启动执行过程
一.浏览器下载HTML/CSS/JavaScript等 当你转到一个页面地址后,浏览器先回下载这个HTML,同时,会开启一些辅助线程下载所关联的script标签和link标签里引用的文件. 二.浏览器 ...