• 解救人质 DFS简单模板


    解救人质,给一张二维地图,有障碍的点不能移动,给定起始点和人质坐标,求到达人质路程的最短路程,DFS模型
    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    int n,m,p,q,Min=99999999;
    int a[51][51],book[51][51];
    
    void dfs(int x,int y,int step)
    {
        int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//规定先向右,下,左,上
        int next_x,next_y,k;
    
        //判断是否到达小哈的位置
        if(x==p&&y==q){
            //更新最小值
            if(step<Min)
                Min=step;
            return ;
        }
        for(k=0;k<=3;k++){
            next_x=x+next[k][0];
            next_y=y+next[k][1];
            //判断是否越界
            if(next_x<1||next_x>n||next_y<1||next_y>m)
                continue;
            //判断改点是否为障碍物或者已经在路径中
            if(a[next_x][next_y]==0&&book[next_x][next_y]==0)
            {
                book[next_x][next_y]=1;//标记已走过
                dfs(next_x,next_y,step+1);//开始尝试下一个点
                book[next_x][next_y]=0;//想象下,在地图上,到头后开始回溯,取消标记
            }
        }
        return ;
    }
    int main()
    {
        int i,j,start_x,start_y;
        cin>>n>>m;
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
            cin>>a[i][j];
        cin>>start_x>>start_y>>p>>q;
    
        //从起点开始搜索
        book[start_x][start_y]=1;
        dfs(start_x,start_y,0);
    
        cout<<Min;
        return 0;
    }
    


  • 相关阅读:
    hdu 1253
    poj 2531 Network Saboteur
    rwkj 1501 数据结构:图的DFS遍历
    rwkj 1306 素数========拓展
    nyist 91 阶乘之和
    nyist 65 另一种阶乘问题
    nyist 31 5个数求最值
    nyist 22 素数求和
    向量 vector
    字符串 统计 ,删除,连接,变换
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256418.html
Copyright © 2020-2023  润新知