您的位置:首页 > 其它

题目1254:N皇后问题

2016-01-17 19:20 295 查看
题目1254:N皇后问题

时间限制:1 秒

内存限制:128 兆

特殊判题:否

题目描述:

N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。



你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。

输入:

输入包含多组测试数据。

每组测试数据输入一个整数n(3<n<=13),表示有n*n的棋盘,总共摆放n个皇后。

输出:

对于每组测试数据,输出总共不同的摆放情况个数,结果单独一行。

样例输入:
4


样例输出:
2


import java.io.BufferedInputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Scanner;

public class Main {

public static void main(String[] args){

Scanner cin = new Scanner(new BufferedInputStream(System.in)) ;
PrintWriter cout = new PrintWriter(System.out) ;

int[] dp = new int[14] ;
for(int i = 3 ; i <= 13 ; i++) dp[i] = new Task().solve(i) ;

while(cin.hasNext()){
cout.println( dp[cin.nextInt()] )  ;
// cout.flush() ;
}

cout.flush() ;
}

}

class  Task{

boolean[][] used  ;
int n ;

int   solve(int n){
this.n = n ;
used = new boolean

;
for(int i = 0 ; i < n ; i++) Arrays.fill(used[i] , false) ;

return dfs(0) ;
}

int dfs(int row){
if(row == n) return 1 ;

int sum =  0 ;
for(int col = 0 ; col < n ; col++){
if(valid(row , col)){
used[row][col] = true ;
sum += dfs(row+1) ;
used[row][col] = false ;
}
}

return sum  ;
}

boolean valid(int row , int col){
for(int r = 0 ; r < row ; r++){
if(used[r][col]) return false ;
}

int x = row , y = col ;
while(x >= 0 && y >= 0){
if(used[x][y]) return false ;
x-- ;
y-- ;
}

x = row ; y = col ;
while(x >= 0 && y < n){
if(used[x][y]) return false ;
x-- ;
y++ ;
}

return true ;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: