藍橋杯:2n皇后問題
阿新 • • 發佈:2019-02-14
問題描述 給定一個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
import java.util.Scanner; public class Main{ public static int count,a[][],n; public static boolean v[][],b[][],w[][]; public static void main(String[] args) { Scanner s=new Scanner(System.in); n=s.nextInt(); a=new int[n][n]; v=new boolean[n][n]; b=new boolean[3][n*2]; w=new boolean[3][n*2]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ a[i][j]=s.nextInt(); } } dft(0); System.out.println(count); } public static void dft(int i){ if(i==n){ count++; return; } for(int j=0;j<n;j++){ if(!v[i][j]&&a[i][j]!=0){ if(!b[0][i+j]&&!b[1][n+i-j]&&!b[2][j]){//b[0]是/,b[1]是\,b[2]是|,三個方向判斷 v[i][j]=true; b[0][i+j]=b[1][n+i-j]=b[2][j]=true; for(int k=0;k<n;k++){ if(!v[i][k]&&a[i][k]!=0){ if(!w[0][k+i]&&!w[1][n+i-k]&&!w[2][k]){ v[i][k]=true; w[0][i+k]=w[1][n-k+i]=w[2][k]=true; dft(i+1); v[i][k]=false; w[0][i+k]=w[1][n-k+i]=w[2][k]=false; } } } v[i][j]=false; b[0][i+j]=b[1][n-j+i]=b[2][j]=false; } } } } }
樣例輸出 2
樣例輸入 4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出 0