八皇后问题 回溯法hdu2553
生活随笔
收集整理的這篇文章主要介紹了
八皇后问题 回溯法hdu2553
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
N皇后問題
Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 29994????Accepted Submission(s): 13085
Problem Description 在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對于給定的N,求出有多少種合法的放置方法。
Input 共有若干行,每行一個正整數N≤10,表示棋盤和皇后的數量;如果N=0,表示結束。
Output 共有若干行,每行一個正整數,表示對應輸入行的皇后的不同放置數量。
Sample Input 1850
Sample Output 19210
Author cgf
Source
2008 HZNU Programming Contest
解題思路就不說了 代碼中說明主意點。。。
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<vector> #include<map> #include<list> #include<stack> #include<set> using namespace std;int n,tot=0,a[15],b[15],row;void dfs(int row)//遞歸搜索可行解,回溯法 {if(row==n)//當row=n時,說明每一行的皇后都不沖突,即為可行解{tot++;return;}else {for(int i=0; i<n; i++){int flag=1;a[row]=i; //嘗試把第row行的皇后放在i列上for(int j=0; j<row; j++) //檢驗是否與前面已放好的皇后沖突{if(a[row]==a[j]||a[row]-row==a[j]-j||a[row]+row==a[j]+j)//注意點,也是理解點{//判斷之前的列有沒有放過,判斷對角線的位置有沒有放皇后,對角線沒什么公式,自己理解。flag=0;break;//跳出最內層循環如果沖突,停止搜索,返回上一級遞歸回溯?;厮莘ǜ咝У年P鍵}}if(flag){dfs(row+1);//往下面一行繼續搜索}}} }int main() {for(int i=1; i<=10; i++)//之前就是沒有這一步預處理,所以TLE了 TT{tot=0;n=i;dfs(0);b[i]=tot;}while(~scanf("%d",&n),n){printf("%d\n",b[n]);} }與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的八皇后问题 回溯法hdu2553的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu1556(树状数组小地方的解释~~
- 下一篇: 面试官问你B树和B+树,就把这篇文章丢给