本帖最后由 DAY 于 2016-9-24 15:55 编辑
如果把数据输入放在主函数main里面就可以提交了,这是为什么啊!/*
* 蓝桥杯-2n皇后问题
* */
import java.util.Scanner;
/*输入的第一行为一个整数n,表示棋盘的大小。
接下来n行,每行n个0或1的整数,如果一个整数为1,
表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。*/
public class Main {
@SuppressWarnings("unused")
private static int STEP = 0 ;
//判断i,j 位置是否合法
@SuppressWarnings("unused")
private static boolean legalWhiteQueen(int[][]a,final int i ,final int j) {
for(int n = 0 ;n < i ; ++n){
for(int m = 0 ; m < a.length ; ++m){
if(a[n][m] == 2){
if(Math.abs(i-n) == Math.abs(j- m) || j == m) return false;
}else continue ;
}
}
return true;
}
//判断i,j位置是否合法
@SuppressWarnings("unused")
private static boolean legalBlackQueen(int[][]a,final int i ,final int j) {
for(int n = 0 ; n < i ; n++){
for(int m = 0 ; m < a.length ;++m){
if(a[n][m] == 3){
if(Math.abs(i-n) == Math.abs(j-m) || j == m)return false;
}
}
}
return true;
}
//TODO 其次判断黑皇后
private static void blackQueen(int[][]a,int tag){
if(tag == a.length){STEP++;/*System.out.println("step:" +step);printArrays(a);System.out.println();*/}
else{
for(int j = 0 ; j < a.length ; ++j){
if(a[tag][j] != 2 && a[tag][j] != 0 ){
a[tag][j] = 3;
if(legalBlackQueen(a, tag, j)){
blackQueen(a, tag+1);
}
a[tag][j] = 1;
}
}
}
}
// TODO 首先判断白皇后
@SuppressWarnings("unused")
private static void whiteQueen(int[][]a,int tag){
if(tag == a.length)blackQueen(a, 0);
else{
for(int j = 0 ; j < a.length; ++j){
if(a[tag][j] != 0){
a[tag][j] = 2;
if(legalWhiteQueen(a, tag, j)){
whiteQueen(a, tag+1);
}
a[tag][j] = 1;
}
}
}
}
@SuppressWarnings({ "unused", "resource" })
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt() ;
int[][]a = new int[n][n] ;
for(int i =0 ;i < n ;++i){
for(int j =0 ; j < n;++j){
a[i][j] = sc.nextInt() ;
}
}
whiteQueen(a, 0);
System.out.println(STEP);
}
}
|