zoukankan      html  css  js  c++  java
  • 题目:校园迷宫

    题目描述

    总算期中考了,鄙人被教育局分配到了SY学校,当然是陪着很多人的。不知转了多少次车,总算到了。可惜的是,SY学校整个像个迷宫一样,就在门口贴了张学校地图。鄙人就开始研究地图了,但是学校错综复杂,等找到目的地,早就开考了。为此,鄙人取出随身携带的微型电脑(不知道从哪来的),向网上发去了求助书。注:只能往4个方向走:上、下、左、右。

    输入格式

    第1行,二个数,N,M。
    接下来是一个N*M的矩阵,表示这个学校。(有N行,M列)。矩阵由2个数字组成。0:路;1:墙。路能走,墙不能走(这是基本常识。不过还是提醒一下,不然哪个牛又要飞檐走壁了)。
    再是2行,第1行2个数X1,Y1表示校门口的坐标(即校门口在矩阵的第X1行,第Y1列)。第2行2个数X2,Y2表示鄙人的考场的坐标(即校门口在矩阵的第X2行,第Y2列)。
    数据范围:0<M,N<=2000。0〈X1,X2〈=N,0〈Y1,Y2〈=M。

    输出格式

    一个数,表示最少要走的步数。如果走不到,则输出 No Answer!

    题解:———————————————————————————————————————————————————

    很多人一看到这道题,就像到了用BFS。

    BFS代码实现:

    #include<iostream>
    using namespace std;

    bool h[2001][2001]={0},g[2001][2001];int m,n,x,y,x1,y1;
    int head=0,title=1;

    int step[4][2]={{1,0},{0,1},{-1,0},{0,-1}};

    struct quen{
           int l,r,d;
           }q[200001];

    void bfs(){
         q[0].l=x;q[0].r=y;q[0].d=0;int i;
        
         while(head<title)
         {
          int x2,y2;
          for(i=0;i<=3;i++)
          {x2=q[head].l+step[i][0];
           y2=q[head].r+step[i][1];
           while(x2>=1&&x2<=n&&h[x2][y2]==0&&y2>=1&&y2<=m&&g[x2][y2]==0)
           {
            h[x2][y2]=1;
            if(x2==x1&&y2==y1) {cout<<q[head].d+1;return ;}
            q[title].l=x2;
            q[title].r=y2;
            q[title].d=q[head].d+1;
            title++;
                                                          }
          
          }head++;
                     
                          }
         cout<<"No Answer!"<<endl;return ;
        
         }

    int main()
    {
        int i,j;
        cin>>n>>m;
        for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        cin>>g[i][j];
       
        cin>>x>>y>>x1>>y1;
       
        h[x][y]=1;
        bfs();
       
        return 0;
       
        }

    然而这道题还有一个更高超的解法,用DFS!值得研究!

    DFS代码实现:

    #include<iostream>
    #define Max 1000000
    using namespace std;

    int f[2001][2001]={0},x1,y1;bool v[2001][2001];

    void dfs(int x,int y,int p){
         if(f[x][y]>p) f[x][y]=p;
         else return ;
         if(x==x1&&y==y1) return;
         if(v[x+1][y]==0) dfs(x+1,y,p+1);
         if(v[x][y+1]==0) dfs(x,y+1,p+1);
         if(v[x-1][y]==0) dfs(x-1,y,p+1);
         if(v[x][y-1]==0) dfs(x,y-1,p+1);
         }

    int main()
    {
        int n,m,x,y;int i,j;
        cin>>n>>m;
       
        for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {cin>>v[i][j];f[i][j]=Max;}
       
        cin>>x>>y>>x1>>y1;

        dfs(x,y,0);
       
        if(f[x1][y1]<Max)  {cout<<f[x1][y1]<<endl;return 0;}
        cout<<"No Answer"<<endl;return 0;
        }

  • 相关阅读:
    tips 前端 阻止 浏览器缓存静态资源
    tips 前端 各个设备的页面尺寸的media query 与页面高度的经验总结
    算法-第四版-练习1.3.28解答
    事件循环(event loop) && 任务队列 (task queue) && $nextTick
    element -ui之<el-table>
    node.js(三 --- stream 管道流 模块化 函数)
    node.js(二 --- events 、buffer、)
    ajax请求的所有状态码详解
    element-ui中el-tree的父元素设置好宽度后不能被子内容撑开的问题
    java获取前端请求字段的方法
  • 原文地址:https://www.cnblogs.com/noip/p/2320107.html
Copyright © 2011-2022 走看看