HDU 2553 DFS N皇后問題

2021-07-28 23:42:17 字數 1800 閱讀 4459

problem description

在n*n的方格棋盤放置了n個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。

你的任務是,對於給定的n,求出有多少種合法的放置方法。

input

共有若干行,每行乙個正整數n≤10,表示棋盤和皇后的數量;如果n=0,表示結束。

output

共有若干行,每行乙個正整數,表示對應輸入行的皇后的不同放置數量。

sample input

185

0

sample output

1

92

只能說**改了好久,腦子總是轉不過來,用空間換取時間

第一種方法,只標記列,通過行與行的差和列與列的差計算是否在45度角上

#include #include #include int n, num;

int ma[15];

int vis[15];

int ans[15];

using namespace std;

//逐行新增

//第一行佔了某一列,則將這一列全部標記

//和45度方向都標記

//阿西吧,想了好久才發現,四十五度上一行標記過,

//再下一行標記,然後取消標記會把第一行的標記也給取消,一萬點生氣

//最後還超時,啊啊啊啊啊啊

//只標記列,通過行與行的差和列與列的差進行判斷45度

//啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊還是超時一萬點崩潰,事先儲存?

void dfs(int h)

for(int i = 1; i <= n; i++)

if(j == h)}}

return;

}int main()

while(~scanf("%d", &n))

return 0;

}

第二種,也就是我最開始寫的,列和45度方向都標記,總是超時,後來換用只標記列的方法依舊超時,超時在可以用空間來換取時間,一開始就將答案儲存到陣列當中,就不會超時了,所以我最開始的方法不再超時

#include #include #include int n, num;

int ma[15][15];

int ans[15];

using namespace std;

//逐行新增

//第一行佔了某一列,則將這一列全部標記

//和45度方向都標記

//阿西吧,想了好久才發現,四十五度上一行標記過,

//再下一行標記,然後取消標記會把第一行的標記也給取消,一萬點生氣

//標記為行值

void biaoji(int h, int l)

}for(int i = 1; h + i < n; i++)

if(l - i >= 0)}}

else if(l - i >= 0)}}

return;

}void quxiaobiaoji(int h, int l)

}for(int i = 1; h + i < n; i++)

if(l - i >= 0)}}

else if(l - i >= 0)}}

return;

}void dfs(int h, int sum)

else}}

return;

}int main()

while(~scanf("%d", &n))

return 0;

}

dfs N皇后問題 HDU 2553

在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數量 如果n 0,表示結束。output 共有若...

DFS N皇后問題

在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數量 如果n 0,表示結束。output 共有若...

HDU 2553 N皇后問題

題目 problem description 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數...