1 #include<iostream> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 int queen[10] = {0}; 6 bool place(int k){ 7 for(int i=0;i<k;i++){ 8 if(queen[k]==queen[i]||abs(k-i)==abs(queen[i]-queen[k])){ 9 return false; 10 } 11 } 12 return true; 13 } 14 int count1=0; 15 void back(int t,int n){ 16 if(t>=n) 17 count1++; 18 else{ 19 for(int i=0;i<n;i++){ 20 queen[t] = i; 21 if(place(t)){ 22 back(t+1,n); 23 } 24 } 25 } 26 } 27 int main(){ 28 int n; 29 while(cin>>n){ 30 count1=0; 31 back(0,n); 32 cout<<count1<<endl; 33 } 34 return 0; 35 } 36 /* 37 #include <iostream> 38 #include <algorithm> 39 #include <string.h> 40 using namespace std; 41 class Queen{ //建立一個Queen類 42 public: 43 int count; 44 Queen(int n){ 45 N = n; 46 count = 0; 47 memset(queens_N, 0, sizeof(queens_N)); 48 }; 49 bool Place(int k); 50 void Backtrack(int t); //回溯求解 51 private: 52 int N; 53 int queens_N[9]; 54 }; 55 bool Queen::Place(int k){ //尋找第k列的位置,要是沒有位置了返回false,要是有位置,返回true 56 for (int j = 0; j < k; j++) { //檢查放在k位置的皇后是否可行 57 if (queens_N[k] == queens_N[j] || abs(k-j) == abs(queens_N[j] - queens_N[k])) return false; 58 } 59 return true; 60 } 61 void Queen::Backtrack(int t){ //回溯方法求解 62 if (t >= N) { 63 count ++; 64 } 65 else{ 66 for (int i = 0; i < N; i++) { 67 queens_N[t] = i; 68 if (Place(t)) { 69 Backtrack(t+1); 70 } 71 } 72 } 73 } 74 int main(int argc, const char * argv[]) { 75 // insert code here... 76 int N; 77 while (cin >> N) { 78 Queen queen(N); //建立N黃後這個類 79 queen.Backtrack(0); //從第一個位置加上回溯 80 cout << queen.count << endl; 81 } 82 return 0; 83 } */ 84 85 86 /*#include<iostream> 87 using namespace std; 88 int count=0; 89 void f(int t){ 90 if(t>0) f(t-1); 91 else count++; 92 } 93 int main(){ 94 f(3); 95 cout<<count<<endl; 96 } */