題目連結:http://poj.grids.cn/practice/2754
總時間限制:
1000ms
記憶體限制:
65536kB
-
描述
-
會下國際象棋的人都很清楚:皇后可以在橫、豎、斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上(有8 * 8個方格),使它們誰也不能被吃掉!這就是著名的八皇后問題。
對於某個滿足要求的8皇后的擺放方法,定義一個皇后串a與之對應,即a=b1b2...b8,其中bi為相應擺法中第i行皇后所處的列數。已經知道8皇后問題一共有92組解(即92個不同的皇后串)。
給出一個數b,要求輸出第b個串。串的比較是這樣的:皇后串x置於皇后串y之前,若且唯若將x視為整數時比y小。
-
輸入
-
第1行是測試資料的組數n,後面跟著n行輸入。每組測試資料佔1行,包括一個正整數b(1 <= b <= 92)
-
輸出
-
輸出有n行,每行輸出對應一個輸入。輸出應是一個正整數,是對應於b的皇后串。
-
範例輸入
-
2192
-
範例輸出
-
1586372484136275
思路:遞迴求解;
小結:如果在判斷的時候,資料不大,那麼可以進行暴力判斷,如此便無需仔細瞭解怎麼樣儲存細節性的問題,這樣子不易出錯,容易調試,是臨場發揮不錯的選擇,我這裡是儲存了相應的列值還有行值,行值用來標記,列植用來判斷斜線,其實直接枚舉整個2維矩陣即可,何必注意這些小細節.
AC Program:
#include <algorithm>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <cstring>typedef long long ll;#defineclr(a)memset((a),0,sizeof (a))#definerep(i,a,b)for(int i=(a);i<(int)(b);i++)#defineper(i,a,b)for(int i=((a)-1);i>=(int)(b);i--)#defineinf0x7ffffff#defineeps1e-6using namespace std;int row[9];int col[9];int mm[9][9]; int cas;int num;int tag;void dfs(int n){ if(tag)return; if(n==9){ cas++; if(cas==num){ for(int i=1;i<=8;i++){ printf("%d",col[i]); } printf("\n"); tag=1; } return; } for(int i=1;i<=8;i++){ if(row[i])continue;//判斷列的方向 if(n==1); else{//斜線判斷 int flag=0; for(int j=1;j<n;j++){//行 int hh=j; int ll=col[j]; int nowhh=n; int nowll=i; if(abs(nowhh-hh)==abs(nowll-ll)){//abs(nowhh-nowll)==abs(hh-ll) flag=1; break; } } if(flag)continue; } //cout<<"n i "<<n<<" "<<i<<endl; col[n]=i;//標註第幾行是第幾列 row[i]=n;//標註第幾列是第幾行,用作標記 mm[n][i]=1; dfs(n+1); col[n]=0; row[i]=0; mm[n][i]=0; } }int main(){ //freopen("f1.txt","w",stdout); int test; scanf("%d",&test); while(test--){ scanf("%d",&num); memset(mm,0,sizeof(mm)); memset(col,0,sizeof(col)); memset(row,0,sizeof(row)); tag=0; cas=0; dfs(1); } //system("pause"); return 0;}