游戏

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector> 
#include<string>
#include<queue>
#include<map>
using namespace std;

struct Node
{
    int t1,t2;
}node[105][105];
int n,m,mint=100000; 
int vis[105][105];
//因为角色必须移动,所以玩家在某个点碰壁后需要往回走(必经之路都被堵了,只能来回走等危险期过去),所以标记数组vis需要在玩家碰壁后重新把附近的点置1 

void dfs(int x,int y,int t)         //优先右下,右下走不了试着左上 
{
    if(x<1 || x>n || y<0 || y>n)    return;
    if(vis[x][y]==0)                return; 
    if(x==n && y==m)
        if(t<mint)    
            mint=t;
    
    if(t>=node[x][y].t1 && t<=node[x][y].t2 ) 
    {
        if(x+1<=n)    vis[x+1][y] = 1;
        if(x-1>=1)    vis[x-1][y] = 1;
        if(y+1<=m)    vis[x][y+1] = 1;
        if(y-1>=1)    vis[x][y-1] = 1;
    }
    else
    {
        vis[x][y]=0;
        dfs(x+1,y,t+1);
        dfs(x-1,y,t+1);
        dfs(x,y+1,t+1);
        dfs(x,y-1,t+1);
    }
}
int main()
{
    //坑点:复制粘贴后 细节未处理清楚 
    //坑点:危险期的点是可以在危险期之后加入的,角色每个单位时间必须移动 
    int t;
    cin>>n>>m>>t;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            vis[i][j]=1;
            node[i][j].t1 = 100000;
            node[i][j].t2 = -1;
        }
    for(int i=0;i<t;i++)
    {
        int r,c,a,b;
        cin>>r>>c>>a>>b;
        node[r][c].t1 = a;    //a<=b
        node[r][c].t2 = b;
    }
    dfs(1,1,0);
    cout<<mint;
    return 0;
}

 

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector> 
#include<string>
#include<queue>
#include<map>
#include<stack>
using namespace std; 
struct Node
{
    int x,y;
    int nowt;
    int t1,t2;
    friend bool operator < (Node a, Node b)
    {
        return a.nowt > b.nowt;//结构体中,nowt小的优先级高
    }
}node[105][105],temp;
int n,m;
int vis[105][105];
priority_queue<Node> q;

//坑点:下一秒的时候坐标(x+1,y)为危险处 不是不可以加入,可以来回走等危险期后加入,根据时间判断+1或+2 
bool bfs()
{
    q.push(node[1][1]);
    vis[1][1] = 0; 
    while(!q.empty())
    {
        temp = q.top();
        if(temp.x == n && temp.y == m)     //由于危险点的介入,普通最先到达不一定是最快的,但可以用优先队列,保证每次都是用时最短的出队 
        {
            cout<<temp.nowt<<endl;
            return true;
        }
        q.pop();
        int x = temp.x;
        int y = temp.y;
        //不越界,未走过
        if(x+1>=1 && x+1<=n && y>=1 &&y<=m && vis[x+1][y]==1 )
        {
            vis[x+1][y] = 0;
            if(node[x][y].nowt+1 < node[x+1][y].t1 || node[x][y].nowt+1 > node[x+1][y].t2)     //bfs保证已经是最快找到该点 
            {
                node[x+1][y].nowt = node[x][y].nowt+1;
                q.push(node[x+1][y]);
            }
            else
            {
                if((node[x+1][y].t2-node[x+1][y].nowt)%2==0)    node[x+1][y].nowt = node[x+1][y].t2+1;
                else                                            node[x+1][y].nowt = node[x+1][y].t2+2;
                q.push(node[x+1][y]);
            }
        }
        if(x-1>=1 && x-1<=n && y>=1 &&y<=m && vis[x-1][y]==1)
        {
            vis[x-1][y] = 0;
            if(node[x][y].nowt+1 < node[x-1][y].t1 || node[x][y].nowt+1 > node[x-1][y].t2)     //bfs保证已经是最快找到该点 
            {
                node[x-1][y].nowt = node[x][y].nowt+1;
                q.push(node[x-1][y]);
            }
            else
            {
                if((node[x-1][y].t2-node[x-1][y].nowt)%2==0)    node[x-1][y].nowt = node[x-1][y].t2+1;
                else                                            node[x-1][y].nowt = node[x-1][y].t2+2;
                q.push(node[x-1][y]);
            }
        }
        if(x>=1 && x<=n && y+1>=1 &&y+1<=m && vis[x][y+1]==1 )
        {
            vis[x][y+1] = 0;
            if(node[x][y].nowt+1 < node[x][y+1].t1 || node[x][y].nowt+1 > node[x][y+1].t2)     //bfs保证已经是最快找到该点 
            {
                node[x][y+1].nowt = node[x][y].nowt+1;
                q.push(node[x][y+1]);
            }
            else
            {
                if((node[x][y+1].t2-node[x][y+1].nowt)%2==0)    node[x][y+1].nowt = node[x][y+1].t2+1;
                else                                            node[x][y+1].nowt = node[x][y+1].t2+2;
                q.push(node[x][y+1]);
            }
        }
        if(x>=1 && x<=n && y-1>=1 &&y-1<=m && vis[x][y-1]==1)
        {
            vis[x][y-1] = 0;
            if(node[x][y].nowt+1 < node[x][y-1].t1 || node[x][y].nowt+1 > node[x][y-1].t2)     //bfs保证已经是最快找到该点 
            {
                node[x][y-1].nowt = node[x][y].nowt+1;
                q.push(node[x][y-1]);
            }
            else
            {
                if((node[x][y-1].t2-node[x][y-1].nowt)%2==0)    node[x][y-1].nowt = node[x][y-1].t2+1;
                else                                            node[x][y-1].nowt = node[x][y-1].t2+2;
                q.push(node[x][y-1]);
            }
        }
    }
    return false;
}
int main()
{
    //坑点:复制粘贴后 细节未处理清楚 
    int t;
    cin>>n>>m>>t;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            vis[i][j]=1;
            node[i][j].x = i;
            node[i][j].y = j;
            node[i][j].t1 = 100000;
            node[i][j].t2 = -1;
            node[i][j].nowt = 0;
        }
    for(int i=0;i<t;i++)
    {
        int r,c,a,b;
        cin>>r>>c>>a>>b;
        node[r][c].t1 = a;    //a<=b
        node[r][c].t2 = b;
    }
    bfs();
    return 0;
}

 

posted @ 2019-03-13 11:43  萌新上路  阅读(99)  评论(0编辑  收藏  举报