自己写回溯法求解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
;
//回溯
}}