zoukankan      html  css  js  c++  java
  • poj3669

    一、题意:流星雨来袭击我们的女主,Bessie。为了找一个安全地方,她开始逃了。地图相当于平面坐标系第一象限,Bessie一开始在原点。然后,每颗流星都会在某个时刻砸下来,砸到的地方连同上下左右都会被毁灭,此时这些地方Bessie就不能通过了,她只能走其它地方。Bessie的移动速度是每时刻移动一步,上下左右,不能对角线移动。现在求Bessie最小的移动步数。

    二、思路:先将会被毁灭的坐标点标记上被毁灭的时间,然后bfs,当到达该坐标的步数小于被毁灭的时间时可走,直到找到第一个不会被毁灭的坐标为止。这里需要注意的一个点就是当时间Ti==0时的情况。

    三、代码:

    #include"iostream"
    #include"stdio.h"
    #include"string.h"
    #include"queue"
    using namespace std;
    
    typedef pair<int,int> P;
    const int MAXN=305;
    
    int coordinate[MAXN][MAXN];
    int dist[MAXN][MAXN];
    
    void CoordinateChange(int x,int y,int time)
    {
        if(coordinate[x][y]>time||coordinate[x][y]==-1)
            coordinate[x][y]=time;
        int dx[4]={0,1,0,-1};
        int dy[4]={1,0,-1,0};
    
        for(int i=0;i<4;i++)
        {
            int nx=x+dx[i];
            int ny=y+dy[i];
    
            if(nx>=0&&ny>=0)
                if(coordinate[nx][ny]>time||coordinate[nx][ny]==-1)
                    coordinate[nx][ny]=time;
        }
    }
    
    bool Judge(int x,int y,int d)
    {
        if(x>=0&&y>=0&&(coordinate[x][y]==-1||d<coordinate[x][y])&&dist[x][y]==-1)
            return true;
        return false;
    }
    
    int Bfs()
    {
        queue<P> que;
        que.push(P(0,0));
    
        while(que.size())
        {
            P p=que.front();que.pop();
    
            if(coordinate[p.first][p.second]==-1)
                return dist[p.first][p.second];
            int dx[4]={0,1,0,-1};
            int dy[4]={1,0,-1,0};
    
            for(int i=0;i<4;i++)
            {
                int nx=p.first+dx[i];
                int ny=p.second+dy[i];
    
                if(Judge(nx,ny,dist[p.first][p.second]+1))
                {
                    dist[nx][ny]=dist[p.first][p.second]+1;
                    que.push(P(nx,ny));
                }
            }
        }
        return -1;
    }
    
    
    int main()
    {
      //  freopen("in.txt","r",stdin);
        int m,x,y,time;
        while(scanf("%d",&m)==1)
        {
            memset(coordinate,-1,sizeof(coordinate));
            memset(dist,-1,sizeof(dist));
    
            for(int i=0;i<m;i++)
            {
                cin>>x>>y>>time;
                CoordinateChange(x,y,time);
            }
            /*
            for(int i=0;i<10;i++)
            {
                for(int j=0;j<10;j++)
                    cout<<coordinate[i][j]<<' ';
                cout<<endl;
            }
            */
            dist[0][0]=0;
            cout<<Bfs()<<endl;
            /*
            for(int i=0;i<10;i++)
            {
                for(int j=0;j<10;j++)
                    cout<<dist[i][j]<<' ';
                cout<<endl;
            }
            */
        }
        return 0;
    }
    

      

      

  • 相关阅读:
    socket的半包,粘包与分包的问题
    /dev/tty /dev/ttyS0 /dev/tty0,/dev/null区别
    23种设计模式小结
    嵌入式试题
    怎样给filter加入自己定义接口及调用
    实现Launcher默认壁纸、选择壁纸定制化功能
    javascript中的稀疏数组(sparse array)和密集数组
    【Linux学习】Linux的文件权限(一)
    HDU--5280(dp或枚举)
    UISegmentedControl UISlider
  • 原文地址:https://www.cnblogs.com/acm-jing/p/9563734.html
Copyright © 2011-2022 走看看