• 蓝桥 算法提高 学霸的迷宫


      算法提高 学霸的迷宫  
    时间限制:1.0s   内存限制:256.0MB
        
    问题描述
      学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线。可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线。
    输入格式
      第一行两个整数n, m,为迷宫的长宽。
      接下来n行,每行m个数,数之间没有间隔,为0或1中的一个。0表示这个格子可以通过,1表示不可以。假设你现在已经在迷宫坐标(1,1)的地方,即左上角,迷宫的出口在(n,m)。每次移动时只能向上下左右4个方向移动到另外一个可以通过的格子里,每次移动算一步。数据保证(1,1),(n,m)可以通过。
    输出格式
      第一行一个数为需要的最少步数K。
      第二行K个字符,每个字符∈{U,D,L,R},分别表示上下左右。如果有多条长度相同的最短路径,选择在此表示方法下字典序最小的一个。
    样例输入
    Input Sample 1:
    3 3
    001
    100
    110

    Input Sample 2:
    3 3
    000
    000
    000
    样例输出
    Output Sample 1:
    4
    RDRD

    Output Sample 2:
    4
    DDRR
    数据规模和约定
      有20%的数据满足:1<=n,m<=10
      有50%的数据满足:1<=n,m<=50
      有100%的数据满足:1<=n,m<=500
    ————————————————————————————————————————————————————
    dfs会超时      为什么会超时,因为dfs是尝试所有路线然后选出最小的那个
     

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include<queue>
    using namespace std;
    const int inf=1005;
    char a[inf][inf];
    char arr[inf],arr1[inf];
    int n,m,minn=1005;
    int book[inf][inf]={0};
    void dfs(int n1,int m1,int cnt)
    {
    if(n1>n||m1>m||n1<1||m1<1)
    return ;
    if(n1==n&&m==m1)
    {
    if(cnt<minn)
    {
    minn=cnt;
    for(int i=0;i<minn;i++)
    {
    arr1[i]=arr[i];
    }
    }
    return ;
    }
    for(int i=0;i<4;i++)
    {
    int x[4]={-1,1,0,0};
    int y[4]={0,0,-1,1};
    if(i==0)
    arr[cnt]='U';
    if(i==1)
    arr[cnt]='D';
    if(i==2)
    arr[cnt]='L';
    if(i==3)
    arr[cnt]='R';
    int x1=n1+x[i];
    int y1=m1+y[i];
    if(a[x1][y1]-'0'==0&&x1>=1&&y1>=1&&x1<=n&&y1<=m&&book[x1][y1]==0)
    {
    book[x1][y1]=1;
    dfs(x1,y1,cnt+1);
    book[x1][y1]=0;
    }
    }
    }
    int main()
    {
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
    for(int j=1;j<=m;j++)
    {
    cin>>a[i][j];
    }
    }
    book[1][1]=1;
    dfs(1,1,0);
    cout<<minn<<endl;
    for(int i=0;i<minn;i++)
    {
    cout<<arr1[i];
    }
    cout<<endl;
    return 0;
    }

    bfs试试
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include<queue>
    using namespace std;
    const int inf=1005;
    char a[inf][inf];
    char arr[inf],arr1[inf];
    int n,m,minn=1005;
    int book[inf][inf]={0};
    struct node{
        int x;
        int y;
        string str;
        int sum=0;
    };
    typedef struct node type;
    struct node v[inf][inf];
    void bfs()
    {
        v[1][1].x=1;
        v[1][1].y=1;
        queue<type> q;
        q.push(v[1][1]);
        while(!q.empty())
        {
            char temp;
            type k1=q.front();
            q.pop();
            for(int i=0;i<4;i++)
            {
            int x[4]={-1,1,0,0};
            int y[4]={0,0,-1,1};
            if(i==0)
            temp='U';
            if(i==1)
            temp='D';
            if(i==2)
            temp='L';
            if(i==3)
            temp='R';
            int x1=k1.x+x[i];
            int y1=k1.y+y[i];
            if(a[x1][y1]-'0'==0&&x1>=1&&y1>=1&&x1<=n&&y1<=m&&book[x1][y1]==0)
            {
                book[x1][y1]=1;
                v[x1][y1].x=x1;
                v[x1][y1].y=y1;
                v[x1][y1].sum=k1.sum+1;
                v[x1][y1].str=k1.str+temp;
                q.push(v[x1][y1]);
            }
           }
        }           
    }
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                cin>>a[i][j];
            }
        }
        book[1][1]=1;
        bfs();
        cout<<v[n][m].sum<<endl;
        cout<<v[n][m].str;
        cout<<endl;
        return 0;
     } 

    bfs不会超时 哈哈哈

    如果你够坚强够勇敢,你就能驾驭他们
  • 相关阅读:
    动态规划之矩阵连乘
    常见的开放符号服务器
    QT中的宏定义
    QT Creator项目路径设置
    批处理-日常小功能用法记录
    Qt Creator快捷键记录
    利用Navicat premium实现将数据从Oracle导入到MySQL
    php BCmath 封装类
    PHP 反射类
    Html标签生成类
  • 原文地址:https://www.cnblogs.com/liuzhaojun/p/11251309.html
Copyright © 2020-2023  润新知