2n 皇后是 n 皇后的一个拓展问题,其实简单了说就是白皇后在黑皇后放好的基础之上再进行放置,其实题目已经给出了放置的判断条件
递归是必须熟练掌握的思维和技术
做题还是要限定时间,讲究方法和效率
#include<iostream>#include<math.h>usingnamespace std;int chessboard[8][8], n,num;bool hashtableB[8], hashtableW[8];int black[8], white[8];voidgenerateW(int index){if(index == n){
num++;return;}for(int x =0; x < n;++x){if(hashtableW[x]==false&& chessboard[index][x]!=0){bool flag =true;for(int pre =0; pre < index;++pre){if((index - pre ==abs(x - white[pre]))){
flag =false;break;}}if(flag){
white[index]= x;
hashtableW[x]=true;generateW(index +1);
hashtableW[x]=false;}}}}voidgenerateB(int index){if(index == n){for(int i =0; i < n;++i){
chessboard[i][black[i]]=0;}generateW(0);for(int i =0; i < n;++i){
chessboard[i][black[i]]=1;}return;}for(int x =0; x < n;++x){if(hashtableB[x]==false&& chessboard[index][x]!=0){bool flag =true;for(int pre =0; pre < index;++pre){if( index - pre ==abs(x - black[pre])){
flag =false;break;}}if(flag){
black[index]= x;
hashtableB[x]=true;generateB(index +1);
hashtableB[x]=false;}}}}intmain(){
cin >> n;for(int i =0; i < n;++i){for(int j =0; j < n;++j){scanf("%d",&chessboard[i][j]);}}generateB(0);
cout<<num;return0;}