problem description
在n*n的方格棋盤放置了n個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的n,求出有多少種合法的放置方法。
input
共有若干行,每行乙個正整數n≤10,表示棋盤和皇后的數量;如果n=0,表示結束。
output
共有若干行,每行乙個正整數,表示對應輸入行的皇后的不同放置數量。
sample input
1850
sample output
192
只能說**改了好久,腦子總是轉不過來,用空間換取時間
第一種方法,只標記列,通過行與行的差和列與列的差計算是否在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,表示棋盤和皇后的數...