POJ百練 2754 八皇后

來源:互聯網
上載者:User

題目連結: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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.