time limit:1000ms
memory limit:32768kb
64bit io format:%i64d & %i64u
description
在n*n的方格棋盤放置了n個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的n,求出有多少種合法的放置方法。
input
共有若干行,每行乙個正整數n≤10,表示棋盤和皇后的數量;如果n=0,表示結束。
output
共有若干行,每行乙個正整數,表示對應輸入行的皇后的不同放置數量。
sample input
1850
sample output
19210
二、解題思路:
要解決n皇后問題,其實就是要解決好怎麼放置這n個皇后,每乙個皇后與前面的所有皇后不能在同一行、同一列、同一對角線,在這裡我們可以以行優先,就是說皇后的行號按順序遞增,只考慮第i個皇后放置在第i行的哪一列,所以在放置第i個皇后的時候,可以從第1列判斷起,如果可以放置在第1個位置,則跳到下一行放置下乙個皇后。如果不能,則跳到下一列...直到最後一列,如果最後一列也不能放置,則說明此時放置方法出錯,則回到上乙個皇后向之前放置的下一列重新放置。此即是回溯法的精髓所在。當第n個皇后放置成功後,即得到乙個可行解,此時再回到上乙個皇后重新放置尋找下乙個可行解...如此後,即可找出乙個n皇后問題的所有可行解。
三、複雜度分析:
關於n皇后問題的複雜度問題可以說是眾說紛紜了,自己也改變過好幾次,剛開始以為棋盤是n行n列,所以理所當然應該是n^2,後來發現在每列選擇可否放置的比較上又做了一次迴圈,所以應該是n^3,但想了很久,發現判斷可否放置的時候不是每次都迴圈到n,它是根據皇后i的取值而變化的,所以複雜度應該是1/3 n^3左右,即是小於n^3的。
以下兩種**是超時的**,但是解題的思路是正確的,如有不理解的參見注釋。
兩種方法主要是用到了回溯法求解,第二種方法是用二維陣列進行優化。
#include #include const int n = 15;
int c[n];
int tot;
int n;
void search(int cur) else
}if(ok)
} }}int main()
return 0;
}
但是經過優化後還是超時,看來只能打表了。
#include #include const int n = 15;
//int c[n];
int tot;
int n;
int vis[4][n*2];
void search(int cur) else
} }}int main()
return 0;
}
ac**
#include int ans[10]=;
int main()
return 0;
}
HDU 2553 N皇后問題
題目 problem description 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數...
HDU 2553 N皇后問題
復健。一題經典的回溯法,要打表。include define max n 11 int n,res int c max n ans max n void dfs int cur if flag dfs cur 1 int main int m while scanf d m m printf d n...
HDU 2553 N皇后問題
題目資訊 一種非常有用的二進位制優化方法 hdu2553n皇后問題 problem description 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。in...