学习笔记-算法-5-递归

18 篇文章 0 订阅
这篇博客介绍了如何使用递归算法解决两个经典的计算机科学问题:一是通过递归寻找迷宫的通路,二是利用递归实现八皇后问题的解决方案。在迷宫问题中,博主设置了地图并演示了如何从起点到终点找到路径;在八皇后问题中,展示了如何放置皇后以避免冲突。递归策略遵循先向下、向右、向上、向左的顺序,并在每个节点判断是否可行。通过这两个问题,深入浅出地讲解了递归在解决复杂问题时的应用。
摘要由CSDN通过智能技术生成

递归

  • 迷宫问题

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;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值