• 迷宫问题


    定义一个二维数组: 

    int maze[5][5] = {
    0, 1, 0, 0, 0,
    0, 1, 0, 1, 0,
    0, 0, 0, 0, 0,
    0, 1, 1, 1, 0,
    0, 0, 0, 1, 0,
    };

    它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

    Input

    一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

    Output

    左上角到右下角的最短路径,格式如样例所示。

    Sample Input

    0 1 0 0 0
    0 1 0 1 0
    0 0 0 0 0
    0 1 1 1 0
    0 0 0 1 0

    Sample Output

    (0, 0)
    (1, 0)
    (2, 0)
    (2, 1)
    (2, 2)
    (2, 3)
    (2, 4)
    (3, 4)
    (4, 4)

    解题思路:结构体保存结点的坐标,用全局的结构体数组保存路径。
    DFS{
    如果到终点,返回。
    判断条件是否符合(是否是’1‘,是否是旧点)。
    搜索结点周围的每一个点。{考虑越界,设置为旧点,保存路径,然后递归下一个点)
    }
    #include <iostream>
    using namespace std;
    struct node{
    	int x;
    	int y;
    };
    int map1[5][5];
    bool vis[5][5];
    node path[50];
    int flag = 0;
    int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
    void DFS(node v, int step){
    	if(flag) return;
    	if(v.x == 4 && v.y == 4){
    		flag = step;
    		return;
    	}
    	if(vis[v.x][v.y] || map1[v.x][v.y]) return;
    	for(int i = 0; i < 4; i++){
    		int dx = v.x + dir[i][0];
    		int dy = v.y + dir[i][1];
    		if(dx < 0 || dy < 0 || dx >4 || dy > 4) continue;
    		if(vis[dx][dy]) continue;
    		vis[v.x][v.y] = 1;
    		v.x = dx; v.y = dy;
    		path[step].x = v.x; path[step].y = v.y;
    		DFS(v,step+1);
    		if(flag) return;
    	}
    	return;
    }
    int main(){
    	node v;
    	v.x = v.y = 0;
    	path[0].x = path[0].y = 0;
    	
    	for(int i = 0; i < 5; i++)
    		for(int j = 0; j < 5; j++){
    			cin>>map1[i][j];
    			vis[i][j] = 0;
    		}
    	DFS(v,1);
    	for(int i = 0;i < flag; i++)
    		cout<<"("<<path[i].x<<", "<<path[i].y<<")"<<endl;	
    	return 0;
    } 
    
  • 相关阅读:
    ecmall 开发一个新模块
    ecmall 如何新增挂件
    ecmall 主从表的4种模型关系
    ecmall 的一些方法说明
    ecmall 支付成功 订单状态没有改变解决办法
    ecmall 基础类分析
    phpcms 新建模块安装
    phpcms pc_base::load
    strptime()方法
    GDB调试方法精粹
  • 原文地址:https://www.cnblogs.com/stul/p/9978964.html
Copyright © 2020-2023  润新知