八皇后问题
来源:互联网 发布:手机版淘宝卖家 编辑:程序博客网 时间:2024/06/04 20:04
问题描述:
在N*N的棋盘上放置N个皇后而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置两个皇后),编程求解所有的摆放方法。
基本思想
1.一行一行摆放皇后,所以不需要判断行冲突
2.判断列冲突时,可以设置一个bool数,如果已经有皇后放在那,bool值设为false,如果可以放置,且没有冲突,设置为true
3.判断对角线冲突,每一行是0,1,2,3,4,;每一列是0,1,2,3,4;5*5的格子就可以设置成两种,分别是副对角线x+y,主对角线x-y,这些对角线的值相等
设置bool vis[3][MaxN] : vis[0][i]:表示第i列元素上已经有一个皇后,并且设为false;vis[1][i]表示第i 个副对角线;vis[2][i]表示第i个主对角线
其对应的程序为:!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n]
第cur个皇后放在第i个位置上,vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
问题就是:主对角线,副对角线如何都放上1
#include<iostream>
using namespace std;
const int MaxN=50;
int n,tot,pos[MaxN];
bool vis[0][MaxN];
void dfs(int cur)
{
int i;
if(cur==n) tot++; //表示摆放方法
else for(i=0;i<n;i++)
{
if(!vis[0][i] && !vis[1][cur+i] && !vis[2][cur+n-i])
{
pos[cur]=i;
vis[0][i]=vis[1][i]=vis[2][i]=1;
dfs(cur+1);
vis[0][i]=vis[1][i]=vis[2][i]=0;
}
}
}
int main()
{
#define QUERY(X) { n=X,tot=0;\
memset(vis,0,sizeof(vis));\
dfs(0);cout<<tot<<endl;\
}//定义一个宏
QUERY(8);
return 0;
}
- 八皇后 n皇后 问题
- 八皇后N皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题(2)
- 八皇后问题(3)
- 八皇后问题
- 八皇后问题程序
- 浅谈八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题求解
- 八皇后问题
- 八皇后问题
- 八皇后问题
- tera term 禁用ALT键
- Spring-MVC4 + JPA2 + MySql-5.5 + SLF4J + JBoss WildFly-8.1开发环境搭建
- 《JavaScript启示录》学习笔记——第2章 对象与属性
- 用class属性来判断聊天窗口是否打开
- js中处理元素id带“/”(正斜杠)的方法
- 八皇后问题
- tcp/ip: 可靠传输的实现
- 第五题(查找最小的k 个元素)
- JSONObject 保存和传送 数组数据 ,如int[] ,double[] ,String[]...
- linux内核cdev_init系列函数(字符设备的注册)
- 块级作用域
- 我把地板上的水三下五除二地收拾干净
- There is no application installed for executable files
- 走出自信,笑出心态