八皇后问题

来源:互联网 发布:手机版淘宝卖家 编辑:程序博客网 时间: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;

}


0 0