递归调用的过程:
迷宫:
public class Maze {
public static void main(String[] args) {
int[][]map=new int[8][7];
//使用1表示墙,上下全部置为1
for (int i=0;i<7;i++){
map[0][i]=1;
map[7][i]=1;
}
//左右置为1
for (int i=0;i<8;i++){
map[i][0]=1;
map[i][6]=1;
}
//设置挡板
map[3][1]=map[3][2]=1;
setWay(map,1,1);
//输出地图
for (int i=0;i<8;i++){
for (int j=0;j<7;j++){
System.out.print(map[i][j]+" ");
}
System.out.println();}
}
/*说明
1.map 表示地图
2.i j表示从地图的哪个位置开始出发
3.如果小球能到map[6][5],则通路找到
4.约定:当map[i][j]=0时表示没走过,为1表示墙,2表示通路可以走,3表示已走过但没走通
5.需先定策略:下-右-上-左,若改点走不通再回溯*/
public static boolean setWay(int[][] map,int i,int j){
if (map[6][5]==2)
return true;
else {
if (map[i][j]==0) {//该点没走过
map[i][j] = 2;//假定改点能走通
if (setWay(map, i + 1, j))//向下走
return true;
else if (setWay(map, i, j + 1))//向右走
return true;
else if (setWay(map, i - 1, j))//向上走
return true;
else if (setWay(map, i, j - 1))//向左走
return true;
else map[i][j] = 3;//该点是死路
}
else{
return false;
}
}
return true;
}
}
八皇后:
public class queen8 {
int max=8;
int[] arr=new int[8];
int count=0;
public static void main(String[] args) {
queen8 queen8 = new queen8();
queen8.check(0);
}
//放置第n个皇后,n从0开始
private void check(int n){
if (n==max){//n=8时,说明8个皇后都放好了
print();
count++;//记录解法的个数
return;
}
for (int i=0;i<max;i++){
arr[n]=i;
if (judge(n)){//不冲突,则接着放第n+1个皇后
check(n+1);
}
//冲突,则继续for循环
}
}
//查看放第n个皇后是否冲突
private boolean judge(int n){
for (int i=0;i<n;i++){
/*arr[i]==arr[n] 第n-1和第n个是否在同一列;
Math.abs(n-i)==Math.abs(arr[n]-arr[i]):
判断第n个和第i个是否在同一斜线:|a[n]-n|==|a[i]-i|*/
if (arr[i]==arr[n]||Math.abs(n-i)==Math.abs(arr[n]-arr[i]))
return false;
}
return true;//不冲突返回true
}
//打印该数组,打印一次表示一个解
private void print(){
for (int i=0;i<arr.length;i++)
System.out.print(arr[i]+" ");
System.out.println();
}
}