HDU 3955 - March(bfs)

本文深入探讨了一款游戏模拟的复杂算法问题,通过详细解析并提供了解决方案,帮助读者理解并解决类似问题。文章内容包括算法设计、数据结构应用、边界条件处理等关键点,旨在提升代码能力和解决问题的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目是模拟一个游戏的,不太好读,它有一些乱七八糟的条件,很容易搞错

http://www.cppblog.com/aswmtjdsj/archive/2011/08/18/153800.html

这位大神的博客里讲得非常清楚

各种绕,各种折腾,哎...还是代码能力不行啊

继续苦练吧。。

#include <stdio.h>
#include <string.h>
#define maxn 105
#define inf 0xffffff
typedef struct
{
    int x;
    int y;
} point;

typedef struct node
{
    int x;
    int y;
    int turn;
    double mp;
} node;

typedef struct
{
    int turn;
    double mp;
}p;

p vis[maxn][maxn];
bool state[maxn][maxn][12];
bool zoc[maxn][maxn];
int mat[maxn][maxn];
node q[1000005];
int n,m;
double MP;
point st,ed;
int dx1[6]= {-1,0,1,1,0,-1};
int dy1[6]= {0,1,0,-1,-1,-1};
int dx2[6]= {-1,0,1,1,0,-1};
int dy2[6]= {1,1,1,0,-1,0};

void pre(int x,int y)
{
    int k=mat[x][y];
    for(int i=9; i>=0; i--)
    {
        if(k>=(1<<i))
        {
            state[x][y][i]=1;
            k-=(1<<i);
        }
    }
}

int bfs()
{
    int front=0,rear=0;
    q[rear].x=st.x;
    q[rear].y=st.y;
    q[rear].mp=MP;
    q[rear].turn=1;
    vis[st.x][st.y].turn=1;
    vis[st.x][st.y].mp=MP;
    rear++;
    while(front<rear)
    {
        node u=q[front];
//        if(u.x==ed.x&&u.y==ed.y)
//        {
//            return 0;
//        }
        if(u.mp<=0)
        {
            u.mp=MP;
            u.turn++;
        }
        int xx,yy;
        for(int i=0; i<6; i++)
        {
            if(u.x%2==0)
            {
                xx=u.x+dx1[i];
                yy=u.y+dy1[i];
            }
            else
            {
                xx=u.x+dx2[i];
                yy=u.y+dy2[i];
            }
            if(xx<0||xx>=n||yy<0||yy>=m)
            {
                continue;
            }
            if(state[xx][yy][3]==1)
            {
                continue;
            }
            if(zoc[u.x][u.y]==1&&zoc[xx][yy]==1)
            {
                if((u.turn<vis[xx][yy].turn||(u.turn==vis[xx][yy].turn&&vis[xx][yy].mp<0)))
                {
                    q[rear].x=xx;
                    q[rear].y=yy;
                    q[rear].turn=u.turn;
                    q[rear].mp=0;
                    vis[xx][yy].turn=u.turn;
                    vis[xx][yy].mp=0;
                    rear++;
                }
            }
            else if(state[u.x][u.y][2]==1&&state[xx][yy][2]==1)
            {
                if(u.turn<vis[xx][yy].turn||(u.turn==vis[xx][yy].turn&&u.mp-0.25>vis[xx][yy].mp))
                {
                    q[rear].x=xx;
                    q[rear].y=yy;
                    q[rear].turn=u.turn;
                    q[rear].mp=u.mp-0.25;
                    vis[xx][yy].turn=u.turn;
                    vis[xx][yy].mp=u.mp-0.25;
                    rear++;
                }

            }
            else if(state[u.x][u.y][i+4]==1)
            {
                if(u.turn<vis[xx][yy].turn||(u.turn==vis[xx][yy].turn&&vis[xx][yy].mp<0))
                {
                    q[rear].x=xx;
                    q[rear].y=yy;
                    q[rear].turn=u.turn;
                    q[rear].mp=0;
                    vis[xx][yy].turn=u.turn;
                    vis[xx][yy].mp=0;
                    rear++;
                }
            }
            else if(state[xx][yy][1]==1)
            {
                if(u.turn<vis[xx][yy].turn||(u.turn==vis[xx][yy].turn&&u.mp-2>vis[xx][yy].mp))
                {
                    q[rear].x=xx;
                    q[rear].y=yy;
                    q[rear].turn=u.turn;
                    q[rear].mp=u.mp-2;
                    vis[xx][yy].turn=u.turn;
                    vis[xx][yy].mp=u.mp-2;
                    rear++;
                }

            }
            else if(state[xx][yy][0]==1)
            {
                if(u.turn<vis[xx][yy].turn||(u.turn==vis[xx][yy].turn&&u.mp-1>vis[xx][yy].mp))
                {
                    q[rear].x=xx;
                    q[rear].y=yy;
                    q[rear].turn=u.turn;
                    q[rear].mp=u.mp-1;
                    vis[xx][yy].turn=u.turn;
                    vis[xx][yy].mp=u.mp-1;
                    rear++;
                }
            }
        }
        front++;
    }
}


int main()
{
    int T,cas=0;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%lf",&n,&m,&MP);
        memset(state,0,sizeof(state));
        memset(zoc,0,sizeof(zoc));
        memset(vis,0,sizeof(vis));
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                vis[i][j].turn=inf;
                vis[i][j].mp=0;
                scanf("%d",&mat[i][j]);
                pre(i,j);
                if(state[i][j][3]==1)
                {
                    int xx,yy;
                    if(i%2==0)
                    {
                        for(int k=0; k<6; k++)
                        {
                            xx=i+dx1[k];
                            yy=j+dy1[k];
                            if(xx>=0&&xx<n&&yy>=0&&yy<m)
                            zoc[xx][yy]=1;
                        }
                    }
                    else
                    {
                        for(int k=0; k<6; k++)
                        {
                            xx=i+dx2[k];
                            yy=j+dy2[k];
                            if(xx>=0&&xx<n&&yy>=0&&yy<m)
                            zoc[xx][yy]=1;
                        }
                    }
                }
            }
        }
        scanf("%d%d%d%d",&st.x,&st.y,&ed.x,&ed.y);
        //ans=inf;
        bfs();
        if(vis[ed.x][ed.y].turn==inf)
        printf("Case %d: -1\n",++cas);
        else
        printf("Case %d: %d\n",++cas,vis[ed.x][ed.y].turn);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值