台哥算法练习:八皇后问题

 
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的标记方法,
  *  因为可能存在不同的两个皇后,它们对同一个位置造成了威胁,如果所
  *  用的标记方法不合理,可能会使不该去标记的位置失去标记。(表达不甚
  *  准确,仔细思考,定能明白其中缘由。)
  * */

 

posted on 2009-11-05 20:21  台哥编程课堂  阅读(201)  评论(0编辑  收藏  举报

导航