八皇后问题

问题描述:

在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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值