HDU-2553 N皇后問題
阿新 • • 發佈:2018-12-10
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
解題思路:深搜,從第一行開始搜的第一個棋子,放n個棋子之後方法加1。
要先打個表算出1到10個棋子的放法有多少種,要不然會超時。
#include<stdio.h> #include<string.h> int e[20][20],num[20]; int n,sum; int judge(int x,int y) { int i,j; for(j=1;j<=n;j++) //同行 if(e[x][j]==1) return 0; for(i=1;i<=x;i++)//同列 if(e[i][y]==1) return 0; for(i=x,j=y;i>=1&&j>=1;i--,j--)//左上45度 if(e[i][j]==1) return 0; for(i=x,j=y;i>=1&&j<=n;i--,j++)//右上45度 if(e[i][j]==1) return 0; return 1; } void dfs(int x,int qi) { int j; if(qi==n+1) sum++; for(j=1;j<=n;j++) { if(judge(x,j)==1) { e[x][j]=1; dfs(x+1,qi+1); e[x][j]=0;//回溯 } } } int main() { int i; memset(num,0,sizeof(num)); for(i=1;i<=10;i++) { memset(e,0,sizeof(e)); sum=0; n=i;//注意這裡的n dfs(1,1);//從第一行查詢第一個棋子 num[i]=sum; //printf("%d\n",num[i]); } while(scanf("%d",&n)!=EOF) { if(n==0) break; printf("%d\n",num[n]); } return 0; }