问题描述:
在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;
}