赞
踩
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
输入格式
输入的第一行为一个整数n,表示棋盘的大小。
接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
输出格式
输出一个整数,表示总共有多少种放法。
样例输入
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
2
样例输入
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
0
import java.util.Scanner; public class Test27 { //定义黑皇后是2,白皇后是3 //1可以放皇后,0不可以放 static int number = 0; //放置的方法的次数 static int writeQ = 0; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[][] nums = new int[n][n]; for(int i = 0;i<n;i++){ for(int j = 0;j<n;j++){ nums[i][j] = sc.nextInt(); } } setQueen(0,n,nums,0); System.out.println(number); } //判断同一行同一列同一斜线是否有皇后 public static boolean OK(int row,int col,int n,int[][] nums,int a){ //第i行第j列的元素 //三个标志 //判断同一列 for (int i = 0; i < row; i++) { // 这是⼀个剪枝 if (nums[i][col] == a) { return false; } } //判断斜线 //正斜线 // 检查 45度⻆是否有皇后 for (int i = row - 1, j = col - 1; i >=0 && j >= 0; i--, j--) { if (nums[i][j] == a) { return false; } } // 检查 135度⻆是否有皇后 for(int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) { if (nums[i][j] == a) { return false; } } return true; } //放置皇后 public static void setQueen(int row,int n,int[][] nums,int flag){ if(row == n){ //终止条件:到达底层 if(flag == 0){ setQueen(0,n,nums,1); }else{ number ++; } return; } //放白皇后 for(int col = 0;col<n;col++){ if(nums[row][col] == 1 && nums[row][col]!=2 &&nums[row][col]!=3 && OK(row,col,n,nums,2) == true && flag == 0){ nums[row][col] = 2; //放置白皇后 setQueen(row+1,n,nums,0); nums[row][col] = 1; } if(nums[row][col] == 1 && nums[row][col]!=2 &&nums[row][col]!=3 && OK(row,col,n,nums,3) == true && flag == 1){ nums[row][col] = 3; //放置黑皇后 setQueen(row+1,n,nums,1); nums[row][col] = 1; } } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。