hdu 2553:N皇后問題(DFS遍歴、水題)
8578 ワード
N皇后問題
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6905 Accepted Submission(s): 3128
Problem Description
N*Nの四角い碁盤には、互いに攻撃しないようにN個の皇后が置かれている(すなわち、任意の2個の皇后は同じ列にいてはならず、同じ列にいても、碁盤の枠と45角の斜線にいてはならない.
あなたの任務は、与えられたNに対して、どれだけの合法的な配置方法があるかを求めることです.
Input
いくつかの行があり、行ごとに正の整数N≦10で、碁盤と皇后の数を表します.N=0の場合、終了を表します.
Output
いくつかの行があり、各行に正の整数があり、入力行に対応する皇后の異なる配置数を表します.
Sample Input
1
8
5
0
Sample Output
1
92
10
Author
cgf
Source
2008 HZNU Programming Contest
Recommend
lcy | We have carefully selected several similar problems for you:
1312
1181
2614
1258
1045
DFS、水題.
すべての状況を再帰的に遍歴すればよい.コードは簡略化する必要がある.この問題に注意するには、事前に表を打つ必要がある.そうしないと、一度尋ねるたびにDFSを再確認し、提出がタイムアウトし、表を打つと1~10のすべての結果を記録し、質問するときに直接記録した結果を出力すればよい.
このように、このような結果がいくつかの値しかない場合、毎回再帰する必要はなく、すべての結果を直接表に出して最後に出力すればよい.そうしないと計算を繰り返すことになる.
Freecode : www.cnblogs.com/yym2013
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6905 Accepted Submission(s): 3128
Problem Description
N*Nの四角い碁盤には、互いに攻撃しないようにN個の皇后が置かれている(すなわち、任意の2個の皇后は同じ列にいてはならず、同じ列にいても、碁盤の枠と45角の斜線にいてはならない.
あなたの任務は、与えられたNに対して、どれだけの合法的な配置方法があるかを求めることです.
Input
いくつかの行があり、行ごとに正の整数N≦10で、碁盤と皇后の数を表します.N=0の場合、終了を表します.
Output
いくつかの行があり、各行に正の整数があり、入力行に対応する皇后の異なる配置数を表します.
Sample Input
1
8
5
0
Sample Output
1
92
10
Author
cgf
Source
2008 HZNU Programming Contest
Recommend
lcy | We have carefully selected several similar problems for you:
1312
1181
2614
1258
1045
DFS、水題.
すべての状況を再帰的に遍歴すればよい.コードは簡略化する必要がある.この問題に注意するには、事前に表を打つ必要がある.そうしないと、一度尋ねるたびにDFSを再確認し、提出がタイムアウトし、表を打つと1~10のすべての結果を記録し、質問するときに直接記録した結果を出力すればよい.
このように、このような結果がいくつかの値しかない場合、毎回再帰する必要はなく、すべての結果を直接表に出して最後に出力すればよい.そうしないと計算を繰り返すことになる.
1 #include <iostream>
2 using namespace std; 3
4 int n,sum; 5 int ans[12],sel[12]; 6
7 int Abs(int n) //
8 { 9 return n>0?n:-n; 10 } 11
12 void f(int h) // i
13 { 14 if(h>n){ // , +1
15 ++sum; 16 return ; 17 } 18 int i,x,y; //(x,y)
19 x = h; //
20 for(y=1;y<=n;y++){ // 21 // , ,
22 for(i=1;i<x;i++) 23 if(y==sel[i]) 24 break; 25 if(i<x) //
26 continue; 27 //
28 for(i=1;i<x;i++) 29 if(Abs(sel[i]-y)==x-i) 30 break; 31 if(i<x) //
32 continue; 33
34 sel[x] = y; // ,
35 f(h+1); 36 } 37 } 38
39 int main() 40 { 41 for(n=1;n<=10;n++){ //
42 sum = 0; 43 f(1); 44 ans[n] = sum; 45 } 46 while(cin>>n){ 47 if(n==0) break; 48 cout<<ans[n]<<endl; 49 } 50 return 0; 51 }
Freecode : www.cnblogs.com/yym2013