八皇后问题
1、经典八皇后问题
要在8*8的国际象棋棋盘中放8个皇后,使任意两个皇后都不能互相吃掉。规则是皇后能吃掉同一行、同一列、同一对角线的棋子。问有多少种摆法。
package dfs; public class EightQueen { /** * @param args */ static int count=0; public static void Bhhs(int [][]a,int n,int x){ if (n==0||x==a.length){ count++; return; } for(int i=0;i<a.length;i++){ if(check(a,x,i)){ a[x][i]=1; Bhhs(a,n-1,x+1); a[x][i]=0; } } } public static boolean check(int[][]a,int x,int y){ int sum1=0,sum2=0,sum3=0,sum4=0; for(int j=0;j<a.length;j++){ sum1+=a[x][j];//行搜索 if(sum1>0){ return false; } sum2+=a[j][y];//列搜索 if(sum2>0){ return false; } } for (int i=0;i<x;i++){ for(int j=0;j<y;j++){ if(y-x==j-i){//正对角线 sum3+=a[i][j]; if(sum3>0){ return false; } } } } for(int i=0;i<x;i++){ for(int j=0;j<a.length;j++){ if(y+x==j+i){//负对角线 sum4+=a[i][j]; if(sum4>0){ return false; } } } } return true; } public static void main(String[] args) { // TODO Auto-generated method stub int n=8; int [][]b=new int[n][n]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ b[i][j]=0; } } Bhhs(b,n,0); System.out.println(count); } }
扩展
n皇后:借鉴于:https://blog.csdn.net/lianggege88/article/details/105715931
package dfs; import java.util.Scanner; public class EightQueen { /** * @param args */ static int count=0; public static void Bhhs(int [][]a,int n,int x){ if (n==0||x==a.length){ count++; return; } for(int i=0;i<a.length;i++){ if(check(a,x,i)){ a[x][i]=1; Bhhs(a,n-1,x+1); a[x][i]=0; } } } public static boolean check(int[][]a,int x,int y){ int sum1=0,sum2=0,sum3=0,sum4=0; for(int j=0;j<a.length;j++){ sum1+=a[x][j];//行搜索 if(sum1>0){ return false; } sum2+=a[j][y];//列搜索 if(sum2>0){ return false; } } for (int i=0;i<x;i++){ for(int j=0;j<y;j++){ if(y-x==j-i){//正对角线 sum3+=a[i][j]; if(sum3>0){ return false; } } } } for(int i=0;i<x;i++){ for(int j=0;j<a.length;j++){ if(y+x==j+i){//负对角线 sum4+=a[i][j]; if(sum4>0){ return false; } } } } return true; } public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner (System.in); int n=sc.nextInt(); int [][]b=new int[n][n]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ b[i][j]=0; } } Bhhs(b,n,0); System.out.println(count); } }
拓展:
八皇后问题
package dfs; import java.util.Scanner; public class EightQueenQuestion { /** * @param args */ static int max=0; static int [][]var=new int [8][8]; static int [][]a=new int [8][8]; public static void dfs(int n,int x,int sum){ if(n==0||x==a.length){ if(sum>max){ max=sum; } return ; } for(int i=0;i<a.length;i++){ if(check(x,i)){ var[x][i]=1; dfs(n-1,x+1,sum+a[x][i]); var[x][i]=0; } } } public static boolean check(int x,int y){ int sum1=0,sum2=0,sum3=0,sum4=0; for(int i=0;i<a.length;i++){ sum1+=var[x][i]; if(sum1>0){ return false; } sum2+=var[i][y]; if(sum2>0){ return false; } } for(int i=0;i<x;i++){ for(int j=0;j<y;j++){ if(y-x==j-i){ sum3+=var[i][j]; if(sum3>0){ return false; } } } } for(int i=0;i<x;i++){ for(int j=0;j<a.length;j++){ if(x+y==i+j){ sum4+=var[i][j]; if(sum4>0){ return false; } } } } return true; } public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ a[i][j]=sc.nextInt(); } } for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ var[i][j]=0; } } dfs(8,0,0); System.out.println(max); } }