2n皇后问题

来源:互联网 发布:电脑软件商店 编辑:程序博客网 时间:2024/05/03 23:00
//2n皇后问题:1、放黑皇后,同时判断一些位置本身是否可放//  2、放白皇后,同时判断一些位置本身是否可放,并要判断一些位置是否已经放了黑皇后#include <iostream>using namespace std;void search_1(int step);//放置黑皇后void search_2(int step);//放置白皇后const int maxn=100;int n,ans=0;int chess[maxn][maxn];//棋盘int vis[3][maxn];//黑皇后的标记int vis1[3][maxn];//白皇后的标记int main(){cin>>n;int i,j;for (i=0;i<n;i++)for (j=0;j<n;j++)cin>>chess[i][j];search_1(0);cout<<ans<<endl;return 0;}void search_1(int step)//(step,i){int i,j;if (step==n) search_2(0);//当黑皇后放完时,开始放白皇后else for (i=0;i<n;i++){if (chess[step][i])//先判断该位置能不能放棋if (!vis[0][i] && !vis[1][step+i] && !vis[2][step-i+n])//判断 列,主对角线,副对角线{vis[0][i]=vis[1][step+i]=vis[2][step-i+n]=1;chess[step][i]=0;//(step,i)放入皇后search_1(step+1);vis[0][i]=vis[1][step+i]=vis[2][step-i+n]=0;//递归完后要恢复chess[step][i]=1;//递归完后要恢复}}}void search_2(int step){int i,j;if (step==n) ans++;//白皇后都放完后,完成一种方法。else for (i=0;i<n;i++){if (chess[step][i])if (!vis1[0][i] && !vis1[1][step+i] && !vis1[2][step-i+n]){vis1[0][i]=vis1[1][step+i]=vis1[2][step-i+n]=1;chess[step][i]=0;//(step,i)放入皇后search_2(step+1);vis1[0][i]=vis1[1][step+i]=vis1[2][step-i+n]=0;chess[step][i]=1;}}}

0 0
原创粉丝点击