Checker Challenge

題目連接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=60489ios

題意:spa

        該題即n皇后問題。給定n行n列,擺放n皇后,使得它們互不攻擊。每一個皇后攻擊範圍爲同行同列和對角線。code

        輸入:單行輸入n,表示給定n*n的棋盤,擺放n個皇后。blog

        輸出:若n大於3,則前三行輸出找出的前三個方案(每一個方案佔一行),第四行輸出方案數,不然(n<3)輸出全部方案後(每一個方案佔一行),單行輸出方案數。
案例:ci

        Sample Inputget

        6it

        Sample Outputio

        2 4 6 1 3 5
        3 6 2 5 1 4
        4 1 5 2 6 3
        4class

分析:stream

       相似於八皇后問題,採用回溯法。

       如下代碼中:"!vis[0][j]"表示判斷j列是否已有皇后,

                        "!vis[1][cur+j]"表示判斷在j列擺放皇后的左對角線是否已擺放皇后,

                        "!vis[2][cur-j+n]"表示判斷在j列擺放皇后的右對角線是否已擺放皇后。
源代碼:

 1 #include<iostream>
 2 using namespace std;
 3 int n,tot;
 4 int vis[50][50],C[15];
 5 void search(int cur)
 6 {
 7     int i,j;
 8     if(cur==n)//皇后擺放完畢
 9     {
10         tot++;
11         if(tot<=3)//輸出前三個案例
12         {
13             for(i=0;i<n-1;i++)
14                 cout<<C[i]+1<<' ';
15             cout<<C[n-1]+1<<endl;        
16         }
17     }
18     else for(j=0;j<n;j++)
19     {
20         if(!vis[0][j]&&!vis[1][cur+j]&&!vis[2][cur-j+n])//判斷是否與前面已擺放的皇后衝突
21         {
22             C[cur]=j;//記錄皇后擺放的列的位置
23             vis[0][j]=vis[1][cur+j]=vis[2][cur-j+n]=1;//修改全局變量
24             search(cur+1);//擺放下一皇后
25             vis[0][j]=vis[1][cur+j]=vis[2][cur-j+n]=0;//清除記錄
26         }
27     }
28 }
29 int main()
30 {
31     cin>>n;
32     tot=0;//案例數
33     search(0);
34     cout<<tot<<endl;
35     return 0;
36 }
相關文章
相關標籤/搜索