zoukankan      html  css  js  c++  java
  • 迷宫问题

    迷宫问题

    整体问题

    判断从起点能否走到终点,如果可以打印出来路径

    思路

    1.创建迷宫
    2.设置起点和终点
    3.如果走到终点退出递归
    4.如果这个点没走过,假设它可以走通,递归的对它的四个方向走,如果通就返回true,四个方向都不通就返回false
    5.如果这个点走过,就不能再走,直接返回false

    优化策略

    1.小球找到的路径与程序员设置的策略有关
    2.可以将各种不同的策略共4乘3乘2乘1种策略依次走一遍,求最短

    代码

    package recursion;
    
    public class Maze {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		//创建数组
    		//级别
    		int [][] map=new int[8][7];
    		//上下全部的置为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]=1;
    		map[3][2]=1;
    		
    		//输出地图
    		System.out.println("地图的情况:");
    		for(int i=0;i<8;i++) {
    			for(int j=0;j<7;j++) {
    				System.out.print(map[i][j]+" ");
    			}
    			System.out.println();
    		}
    		//使用递归回溯给小球找路
    		boolean flag=setWay(map, 1, 1);
    		System.out.println(flag);
    		//输出新的地图,这个地图中就有小球走过的路
    		//标识过的地图,有通路就是2,没有通路就是3
    		for(int i=0;i<8;i++) {
    			for(int j=0;j<7;j++) {
    				System.out.print(map[i][j]+" ");
    			}
    			System.out.println();
    		}
    		
    	}
    	
    	//使用递归函数来给小球找路
    	//map表示对应的矩阵
    	//i,j表示从哪个位置开始找
    	//表示如果找到通路的话,就返回true,否则就返回false
    	//如果小球可以到map[6][5]位置,就说明通路已经找到,
    	//约定,当地图的(i,j)为0的时候,表示没有走过,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+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;
    					return false;
    				}
    			}else {//可能是1,2,或者3
    				return false;
    			}
    		}
    	
    	}
    	
    
    }
    
    
  • 相关阅读:
    Codeforces Round #687 A. Prison Break
    最小生成树自用笔记(Kruskal算法+prim算法)
    Codeforces Round #686 (Div. 3)(A->D)(模拟,vector,数学)
    Acwing 852. spfa判断负环
    Linux内核分析_课程学习总结报告
    结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程
    深入理解系统调用
    基于mykernel 2.0编写一个操作系统内核
    何评测一个软件工程师的计算机网络知识水平与网络编程技能水平?——参考试题
    TCP三次握手Linux源码解析
  • 原文地址:https://www.cnblogs.com/mengxiaoleng/p/11644129.html
Copyright © 2011-2022 走看看