• U68364 _GC滑迷宫


    U68364 _GC滑迷宫

           本题的特殊之处在于,_GC只能滑着走。具体来说就是,选定一个方向后,_GC会一直向该方向滑,直到撞到墙。

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    #include<queue> 
    #include <bits/stdc++.h>
    using namespace std;
    int n,m,sx,sy; 
    int dx[4]={-1,1,0,0},
        dy[4]={0,0,-1,1};
    bool bz[501][501];
    bool vis[501][501];
    struct pos
    {
        int x,y,step;
        pos(int xx,int yy,int stepp) : x(xx),y(yy),step(stepp) {}   
    //构造函数,把xx赋值给x(后边也是); }; queue
    <pos> q; //定义一个pos类型的队列q bool pan(int x,int y) //判断合法性(防止出现_GC卡在墙里) { return x>=1&&x<=n&&y>=1&&y<=m&&bz[x][y]==0; } bool out(int x,int y) //判断是否已到达迷宫边界,即可以离开迷宫 { return (x==1||x==n||y==1||y==m)&&bz[x][y]==0; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>bz[i][j]; cin>>sx>>sy; if(bz[sx][sy]) //如果初始位置是墙,则无解 { cout<<"-1"; return 0; } if(out(sx,sy)) //如果初始位置在边界,则直接离开 { cout<<"0"; return 0; } q.push(pos(sx,sy,0)); //入队 vis[sx][sy]=1; //标记已经走过 while(!q.empty()) //队列非空 { pos h=q.front(); //把队首元素的三个值全部赋值给h q.pop(); //队首出队 if(out(h.x,h.y)) //如果到达出口 { cout<<h.step-1; //因为原题求的是撞墙次数,而我们知道最后一次是不撞墙的 return 0; //直接退出,因为已求得最优解 } for(int i=0;i<=3;i++) { int xx=h.x,yy=h.y; while(pan(xx+dx[i],yy+dy[i])) //如果没撞到墙,就继续走 { xx+=dx[i]; //_GC要一直滑啊滑 yy+=dy[i]; //滑啊滑 } if((xx==h.x&&yy==h.y)||vis[xx][yy]) //如果并没有移动,或者最终位置已到达过 continue; vis[xx][yy]=1; q.push(pos(xx,yy,h.step+1)); } } cout<<-1; //如果所有可能节点都已遍历,而始终没有到达边界,则无解 }
  • 相关阅读:
    liunx下mysql数据库使用之三范式,关系模型设计注意项,安装目录结构
    Liunx系统学习一,liunx系统的目录结构及含义
    liunx环境下的mysql数据库配置文件my.conf内的参数含义
    linux下打开chm文件的方法
    java的四舍五入算法
    【JVM】jvm垃圾回收器相关垃圾回收算法
    Linux下MySQL数据库常用基本操作 一
    liunx环境下安装mysql数据库
    加权平均
    Host绑定
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/10705572.html
Copyright © 2020-2023  润新知