HDU 2553 N皇后問題 (初試回溯)

2021-06-23 04:06:16 字數 1688 閱讀 4708

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

185

0

sample output

1

9210

二、解題思路:

要解決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...