首页 > 代码库 > 八皇后问题 2017 4 24

八皇后问题 2017 4 24


#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int queen[10] = {0};

bool place(int k){
 for(int i=0;i<k;i++){
  if(queen[k]==queen[i]||abs(k-i)==abs(queen[i]-queen[k])){
   return false;
  }
 }
 return true;
}
int count1=0;
void  back(int t,int n){
 if(t>=n)
     count1++;
 else{
       for(int i=0;i<n;i++){
       queen[t] = i;
       if(place(t)){
         back(t+1,n);
       }
    }
    }
}
int main(){
 int n;
 while(cin>>n){
    count1=0;
    back(0,n);
    cout<<count1<<endl; 
 }
 return 0;
}

/*
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

class Queen{         //创建一个Queen类
public:
    int count;
    Queen(int n){
        N = n;
        count = 0;
        memset(queens_N, 0, sizeof(queens_N));
    };
    bool Place(int k); 
    void Backtrack(int t);  //回溯求解
private:
    int N;
    int queens_N[9];
};
bool Queen::Place(int k){         //寻找第k列的位置,要是没有位置了返回false,要是有位置,返回true
    for (int j = 0; j < k; j++) {  //检查放在k位置的皇后是否可行
        if (queens_N[k] == queens_N[j] || abs(k-j) == abs(queens_N[j] - queens_N[k])) return false;
    }
    return true;
}
void Queen::Backtrack(int t){     //回溯方法求解
    if (t >= N) {
        count ++;
    }
    else{
        for (int i = 0; i < N; i++) {
            queens_N[t] = i;
            if (Place(t)) {
                Backtrack(t+1);
            }
        }
    }
}
int main(int argc, const char * argv[]) {
    // insert code here...
    int N;
    while (cin >> N) {
        Queen queen(N);     //创建N黄后这个类
        queen.Backtrack(0);  //从第一个位置加上回溯
        cout << queen.count << endl;
    }
    return 0;
}      */ 

 


/*#include<iostream>
using namespace std;
int count=0;
void f(int t){
   if(t>0) f(t-1);
   else count++;
}
int main(){
 f(3);
 cout<<count<<endl;
} */

 

八皇后问题 2017 4 24