hdu1026

44 篇文章 0 订阅

进bfs了。。。

蒟蒻的自我拯救。。。

#include<cstdio>  
#include<cstring>  
#include<queue>  
using namespace std;  
  
int mak[110][110];  
int d[4][2]={1,0,-1,0,0,-1,0,1};  
int t,n,m;  
  
struct node  
{  
    int x,y,time;  
    friend int operator<(node a,node b)  
    {  
        return a.time>b.time;  
    }  
};  
struct out  
{  
    char c;  
    int lx,ly,fight;  
}map[110][110];  
  
/* 
struct cmp 
{ 
    bool operator()(const node &a,const node &b) 
    { 
        return a.time>b.time; 
    } 
}; 
*/  
  
priority_queue<node> q;  
bool find(node first)  
{  
  
    node now,next;  
    while(!q.empty())q.pop();  
    if(map[first.x][first.y].c>='0'&&map[first.x][first.y].c<='9')  
    {  
        map[first.x][first.y].fight=map[first.x][first.y].c-'0';  
        first.time=map[first.x][first.y].fight;  
    }  
    else first.time=0;  
    q.push(first);  
    while(!q.empty())  
    {  
        now=q.top();  
        q.pop();  
        if(now.x==0&&now.y==0)  
        {  
            t=now.time;  
            return true;  
        }  
        for(int i=0;i<4;++i)  
        {  
            next.x=now.x+d[i][0];  
            next.y=now.y+d[i][1];  
            if(next.x<0||next.y<0||next.x==n||next.y==m||map[next.x][next.y].c=='X'||mak[next.x][next.y]) continue;  
            mak[next.x][next.y]=1;  
            next.time=now.time+1;  
            if(map[next.x][next.y].c>='0'&&map[next.x][next.y].c<='9')  
            {  
                map[next.x][next.y].fight=map[next.x][next.y].c-'0';  
                next.time+=map[next.x][next.y].fight;  
            }  
            map[next.x][next.y].lx=now.x;  
            map[next.x][next.y].ly=now.y;  
            q.push(next);  
        }  
    }  
    return false;  
}  
  
int main()  
{  
    node first;  
 //   freopen("F://cs.txt","r",stdin);  
    while(scanf("%d%d",&n,&m)!=EOF)  
    {  
        getchar();  
        memset(mak,0,sizeof(mak));  
        for(int i=0;i<n;++i)  
        {  
            for(int j=0;j<m;++j)  
            {  
                scanf("%c",&map[i][j].c);  
                map[i][j].fight=0;  
            }  
            getchar();  
        }  
        first.x=n-1;  
        first.y=m-1;  
        first.time=0;  
        if(find(first))  
        {  
            printf("It takes %d seconds to reach the target position, let me show you the way.\n",t);  
            int k=1,x=0,y=0;  
            int nx,ny;  
            while(k<=t)  
            {  
                nx=map[x][y].lx,ny=map[x][y].ly;  
                printf("%ds:(%d,%d)->(%d,%d)\n",k++,x,y,nx,ny);  
                while(map[nx][ny].fight)  
                {  
                    printf("%ds:FIGHT AT (%d,%d)\n",k++,nx,ny);  
                    --map[nx][ny].fight;  
                }  
                x=nx;y=ny;  
            }  
        }  
        else puts("God please help our poor hero.");  
        puts("FINISH");  
    }  
    return 0;  
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值