• 迷宫问题


    ①用递归做,会超时

    #include <iostream>
    #include <string>
    #include <stack>
    #include <queue>
    using namespace std;
    
    int maze[1005][1005];
    int mark[1005][1005];
    int xb,yb,xe,ye;
    
    struct position
    {
        int px,py;
    }point[9999];
    
    struct Offsets
    {
        int dx,dy;
        Offsets(int x=0,int y=0):dx(x),dy(y) {}
    };
    Offsets guide[4]= { {1,0},{0,-1},{-1,0},{0,1} };
    int f=0;
    void dfs(int xb,int yb,int step)
    {
    
        if(xb==xe && yb==ye)
        {
           for(int i=0;i<step;i++)
            cout<<point[i].py<<" "<<point[i].px<<endl;
         //   cout<<endl;
            f=1;
           return;
        }
        for(int i=0;i<4;i++)
        {
            int x = xb+guide[i].dx;
            int y = yb+guide[i].dy;
            if(mark[x][y] == 0 || mark[x][y]==4)
            {
                mark[x][y] = 1;
                point[step].px = x;
                point[step].py = y;
                dfs(x,y,step+1);
                if(f==1)
            return;
                mark[x][y] = 0;
            }
        }
        if(f==1)
            return;
    }
    
    
    int main()
    {
        int N,M;
        cin>>N>>M;
        //初始化
        for(int i=0; i<M; i++)
            for(int j=0; j<N; j++)
            {
                cin>>maze[i][j];
                mark[i][j] = maze[i][j];
                if(maze[i][j] == 3)
                {
                    xb = i;
                    yb = j;
                }
                if(maze[i][j] == 4)
                {
                    xe = i;
                    ye = j;
                }
            }
        /*  for(int i=0; i<M; i++)
          {
              for(int j=0; j<N; j++)
                  cout<<maze[i][j];
              cout<<endl;
          }*/
        point[0].px = xb;
        point[0].py = yb;
        dfs(xb,yb,1);
        return 0;
    }
    /*
    8 10
    1 1 1 1 1 1 1 1
    1 0 1 1 0 1 0 1
    1 0 1 0 0 1 0 1
    1 1 0 3 1 0 1 1
    1 0 0 1 0 0 4 1
    1 0 0 0 0 1 1 1
    1 0 1 0 0 1 0 1
    1 0 1 0 0 0 1 1
    1 1 1 1 0 0 0 1
    1 1 1 1 1 1 1 1
    */

     ②用栈的思想做

    #include <iostream>
    #include <string>
    #include <stack>
    #include <queue>
    using namespace std;
    /*
    8 10
    1 1 1 1 1 1 1 1
    1 0 1 1 0 1 0 1
    1 0 1 0 0 1 0 1
    1 1 0 3 1 0 1 1
    1 0 0 1 0 0 4 1
    1 0 0 0 0 1 1 1
    1 0 1 0 0 1 0 1
    1 0 1 0 0 0 1 1
    1 1 1 1 0 0 0 1
    1 1 1 1 1 1 1 1
    */
    int maze[1005][1005];
    int mark[1005][1005];
    int xb,yb,xe,ye;
    
    struct position
    {
        int px,py;
    } point[99999];
    
    struct Offsets
    {
        int dx,dy;
        Offsets(int x=0,int y=0):dx(x),dy(y) {}
    };
    Offsets guide[4]= { {1,0},{0,-1},{-1,0},{0,1} };
    
    int main()
    {
        int N,M;
        cin>>N>>M;
        //初始化
        for(int i=0; i<M; i++)
            for(int j=0; j<N; j++)
            {
                cin>>maze[i][j];
                mark[i][j] = maze[i][j];
                if(maze[i][j] == 3)
                {
                    xb = i;
                    yb = j;
                }
                if(maze[i][j] == 4)
                {
                    xe = i;
                    ye = j;
                }
            }
        /*  for(int i=0; i<M; i++)
          {
              for(int j=0; j<N; j++)
                  cout<<maze[i][j];
              cout<<endl;
          }*/
        point[0].px = xb;
        point[0].py = yb;
        int t = 0;
        while(1)
        {
           int ff = 0;
            for(int i=0; i<4; i++)
            {
                int x = point[t].px+guide[i].dx;
                int y = point[t].py+guide[i].dy;
                if(mark[x][y] == 0 && maze[x][y] == 0)
                {
                   t++;
                    mark[x][y] = 1;
                    point[t].px = x;
                    point[t].py = y;
                    ff = 1;
                    break;
                }
                if(maze[x][y] == 4)
                {
                    for(int i = 0; i <= t; i++)
                        cout<<point[i].py<<' '<<point[i].px<<endl;
                    cout<<y<<' '<<x<<endl;
                   return 0;
                }
            }
            if(ff==0)
                t--;
        }
        return 0;
    }
  • 相关阅读:
    20款时尚的 WordPress 博客主题【免费下载】
    垂涎欲滴!30个美味的食品类移动应用程序【上篇】
    Skippr – 轻量、快速的 jQuery 幻灯片插件
    Boba.js – 用于 Google 统计分析 JavaScript 库
    长期这么做的后果就是人民劳苦而得不到该有的回报,怎么能不垮
    左值与右值的根本区别在于能否获取内存地址,而能否赋值不是区分的依据
    百度后端C++电话一面
    Web 开发和数据科学家仍是 Python 开发的两大主力
    Consul架构
    去除两端逗号-JS
  • 原文地址:https://www.cnblogs.com/syzyaa/p/13993758.html
Copyright © 2020-2023  润新知