回溯法解n后问题

来源:互联网 发布:费迪南德拳击 知乎 编辑:程序博客网 时间:2024/05/11 04:30
自己写回溯法求解n后问题,有什么可以改进大家指点指点微笑微笑微笑
/** * n后问题 * @param a 基础数组 全为0 * @param n 默认为0 */public static void b(int [][]a,int n){    //判断是否已经添加到最后一行是就打印当前的结果    if(n==a.length){        print(a);
//打印
num++; return; } for(int i=0;i<a.length;i++){ boolean flag=true; a[n][i]=1;//循环对当前行的每一列放置棋子 for(int j=n;j>=0;j--){//判断放置棋子的这一列是否有棋子 if(a[j][i]==1&&j!=n){ a[n][i]=0;//回溯 flag=false; break; } } if(flag==false){ continue;//在下一个位置放置棋子
} for(int j=n,m=i;j>=0&&m>=0;j--,m--){//判断放置棋子的左上方是否有棋子 if(a[j][m]==1&&j!=n){ a[n][i]=0;//回溯 flag=false; break; } } if(flag==false){ continue;//在下一个位置放置棋子
} for(int j=n,m=i;j>=0&&m<a.length;j--,m++){//判断放置棋子的右上方是否有棋子 if(a[j][m]==1&&j!=n){ a[n][i]=0;//回溯 flag=false; break; } } if(flag==false){ continue;//在下一个位置放置棋子 }if(flag){
    queen(a,n+1);//可以放置则放置下一行
} a[n][i]=0;//回溯 }}

1 0
原创粉丝点击