N皇后问题
HDU - 2553
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。Output共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。Sample Input
你的任务是,对于给定的N,求出有多少种合法的放置方法。
1 8 5 0Sample Output
1 92 10
题意:就不用说了吧......
思路:dfs+回溯 (但是要先打表,否则会超时)
Java AC代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int maze[][] = new int[15][15];
static int vis[] = new int [15];
static int ans[] = new int [15];
static int n,cnt;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner (System.in);
for(n=1;n<=10;++n){
Arrays.fill(vis, 0);
cnt = 0;
dfs(1,1);
ans[n] = cnt;
}
while(cin.hasNext()){
n = cin.nextInt();
if(n==0) break;
System.out.println(ans[n]);
}
}
static void dfs(int row,int step){
if(step==n+1){
cnt++;
// show();
return;
}
for(int i =1;i<=n;++i){
if(judge(row,i,step)&&vis[i] == 0){
vis[i] = 1;
maze[row][i] = step;
dfs(row+1,step+1);
vis[i] = 0;
maze[row][i] = 0;
}
}
}
static boolean judge(int x,int y,int step){
for(int i=1;i<step;++i){
for(int j=1;j<=n;++j){
if(maze[i][j]!=0){
if(Math.abs(i-x)==Math.abs(j-y))
return false;
}
}
}
return true;
}
/* static void show(){
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
System.out.print(maze[i][j]);
}
System.out.println();
}
System.out.println();
}*/
}