public class tai { int[]x=new int[9]; int[][]a=new int[9][9]; public int check(int i){ /**递归*/ for(int j=1;j<=8;j++){ if(a[j]==0){ x=j; a_add(i,j); if(i<8&&check(i+1)==0){ a_subtract(i,j); x=0; continue; } if(i==8&&x!=0){ a_subtract(i,j); p(); x=0; continue; } return x; } } return 0; } public void p(){ /**打印*/ for(int i=1;i<=8;i++){ System.out.print(x); } System.out.println(); } public void a_add(int i,int j){ /**标记*/ for(int m=i;m<=8;m++) for(int n=1;n<=8;n++){ if(n==j)a[m][n]++; if(Math.abs(m-i)==Math.abs(n-j))a[m][n]++; } } public void a_subtract(int i,int j){ /**去标记*/ for(int m=i;m<=8;m++) for(int n=1;n<=8;n++){ if(n==j)a[m][n]--; if(Math.abs(m-i)==Math.abs(n-j))a[m][n]--; } } public static void main(String[] args) { // TODO 自动生成方法存根 tai t=new tai(); t.check(1); } } /** * 需要注意的是:添加标记时,不能简单的用类似a[j]=1的标记方法, * 因为可能存在不同的两个皇后,它们对同一个位置造成了威胁,如果所 * 用的标记方法不合理,可能会使不该去标记的位置失去标记。(表达不甚 * 准确,仔细思考,定能明白其中缘由。) * */