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