递归
- 迷宫问题
public calss MiGong{
public static void main(String[] args){
//地图
int[][] map new int[8][7];
// 上下墙
for(int i=0;i<7;i++){
map[0][i] = 1;
map[7][i] = 1;
}
// 左右墙
for(int i=0;i<8;i++){
map[i][0] = 1;
map[i][6] = 1;
}
// 设置挡板
map[3][1] = 1;
map[3][2] = 1;
// 输出地图
for(int i=0;i<8;i++){
for(int j=0;j<7;j++){
System.out.printf(map[i][j]+" ");
}
System.out.println();
}
setWay(map,1,1);
// 输出地图
for(int i=0;i<8;i++){
for(int j=0;j<7;j++){
System.out.printf(map[i][j]+" ");
}
System.out.println();
}
}
// 使用递归找路
// i,j:从哪个位置开始找
// 找到通路返回true,否则返回false
// [6,5]为终点
// map[i][j]=1,为墙,2为可以走,3,已走过,但不通
// 策略:先走下->右->上->左
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+i,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; // 走不通
return false;
}
}else{
return false;
}
}
}
}
- 八皇后问题
public class Queue{
int max = 8; // 8个皇后 8*8 棋盘
int[] array = new int[max]; // 皇后的位置
int count = 0;
public static void main(String[] args){
Queue queue = new Queue();
queue.check(0);
System.out.printf("一共有%d次",count);
}
// 放置第n个皇后
private void check(int n){
if(n==max){ // 已经放满
print();
return;
}
for(int i=0;i<max;i++){
// 从第一列开始放置
array[n] = i;
if(judge(n)){ //不冲突
// 接着放n+1个皇后
check(n+1);
}
}
}
// 皇后摆放的位置
pulic void print(){
count++;
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
System.out.println();
}
// 放置第n个皇后,检测该皇后是否和前面摆放的皇后冲突
private boolean judge(int n){
for(int i=0;i<n;i++){
if(array[i] == array[n] // 是否同一列
|| Math.abs(n-i) == Math.abs(array[n]-array[i])){ // 是否斜率为1或-1
return false;
}
}
return true;
}
}