问题描述:在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实现)的更多相关文章

  1. 八皇后问题的Python实现和C#实现

    看到八皇后问题的解决思路, 感觉很喜欢. 我用C#实现的版本之前贴在了百度百科上(https://baike.baidu.com/item/%E5%85%AB%E7%9A%87%E5%90%8E%E9 ...

  2. N皇后问题的python实现

    数据结构中常见的问题,最近复习到了,用python做一遍. # 检测(x,y)这个位置是否合法(不会被其他皇后攻击到) def is_attack(queue, x, y): for i in ran ...

  3. 面试基础知识集合(python、计算机网络、操作系统、数据结构、数据库等杂记)

    python python _.__.__xx__之间的差别 python中range.xrange和randrange的区别 python中 =.copy.deepcopy的差别 python 继承 ...

  4. Python学习二(生成器和八皇后算法)

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

  5. Python解决八皇后问题

    最近看Python看得都不用tab键了,哈哈.今天看了一个经典问题--八皇后问题,说实话,以前学C.C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的 ...

  6. 八皇后,回溯与递归(Python实现)

    八皇后问题是十九世纪著名的数学家高斯1850年提出 .以下为python语句的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩 ...

  7. 【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)

    八皇后问题是一道经典的回溯问题.问题描述如下:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉?         看到这个问题,最容易想 ...

  8. Python 八皇后问题

    八皇后问题描述:在一个8✖️8的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解法. 规则分析: 任意两个棋子不能在同一行比较好办,设置一个队列,队列里的每个元 ...

  9. 【算法】八皇后问题 Python实现

    [八皇后问题] 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...

随机推荐

  1. idea在相应的包下右键创建servlet,找不到servlet选项

    开始pom.xml文件里面我是只引进了个servlet包,但是右键依旧没有servlet选项 <dependency> <groupId>javax.servlet</g ...

  2. IntelliJ IDEA 2017版 编译器使用学习笔记(十) (图文详尽版);IDE快捷键使用;IDE关联一切

    关联一切 一.与spring关联      通过图标跳转相关联的类 设置关联:进入project structure ===>facets =>选加号,===>选spring,默认添 ...

  3. 很实用的linux 上的svn安装和svnserver 的重启

    虽然在windows上搭建SVN很简单,但是效能却不高,这当然是和linux相比了.然而在linux上搭建SVN却非常繁琐,所以今天这篇文章就来一步一步教您如何在Centos上搭建SVN 安装 #yu ...

  4. canvas制作表盘

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. 强制DataNode向NameNode上报blocks

    正常情况下,什么时候上报blocks,是由NameNode通过回复心跳响应的方式触发的. 一次机房搬迁中,原机房hadoop版本为2.7.2,新机房版本为2.8.0,采用先扩容再缩容的方式搬迁.由于新 ...

  6. idea常用插件介绍

    常用插件 mybatis mapper 选择plugins,搜索mybatis plugin 激活教程 使用 插件的使用

  7. 设置customer_id

    update t_user_identification u set u.customer_id = (select c.customer_id from t_customer c from t_us ...

  8. Hdu2068 RPG的错排 2017-06-27 15:27 30人阅读 评论(0) 收藏

    RPG的错排 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submis ...

  9. 初始kafka

    kafka 简介 Kafka是Linkedin于2010年12月份开源的消息系统 一种分布式的.基于发布/订阅的消息系统 ,另外提供数据分布式缓存功能 特点 消息持久化:通过O(1)的磁盘数据结构提供 ...

  10. [au3]复制选择性粘贴文本到excel

    案例:在一张网页上有许多你要复制的内容,但是你必须一个一个找到他们,然后一个一个复制出来粘贴到excel表格里.时间一长你的眼睛容易花,而且复制多了容易出错. 方法:当然有许多方法可以自动化的做这一件 ...