hdu 1026 (优先队列+bfs)

来源:互联网 发布:照片调色软件 编辑:程序博客网 时间:2024/06/04 23:31
#include<queue>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;struct node{  int dis;  int x;  int y;  int pre,id,flag;  bool operator <(node a) const  {      return dis>a.dis;  }}data[500000];int tot;int dx[]={-1,1,0,0};int dy[]={0,0,-1,1};int n,m;char map[105][105];char vis[105][105];void print(int k){    if(data[k].pre==-1) return;    print(data[k].pre);    int fa=data[k].pre;    printf("%ds:(%d,%d)->(%d,%d)\n",tot++,data[fa].x,data[fa].y,data[k].x,data[k].y);    for(int i=0;i<data[k].flag;i++)    {        printf("%ds:FIGHT AT (%d,%d)\n",tot++,data[k].x,data[k].y);    }}void bfs(){    priority_queue<node> q;    node tmp,tt;    data[0].x=0;data[0].y=0;data[0].dis=0;    data[0].id=0;data[0].pre=-1;data[0].flag=0;    int p=0;    p++;    q.push(data[0]);    while(!q.empty())    {        tmp=q.top(); q.pop();        for(int i=0;i<4;i++)        {            data[p]=tmp;            data[p].x=tmp.x+dx[i];            data[p].y=tmp.y+dy[i];            if(data[p].x>=0&&data[p].x<n&&data[p].y>=0&&data[p].y<m&&!vis[data[p].x][data[p].y]&&map[data[p].x][data[p].y]!='X')            {                vis[data[p].x][data[p].y]=1;                data[p].id=p;                data[p].pre=tmp.id;                if(map[data[p].x][data[p].y]=='.') {data[p].flag=0;data[p].dis=tmp.dis+1;}                else {data[p].flag=map[data[p].x][data[p].y]-'0';data[p].dis=tmp.dis+1+data[p].flag;}                if(data[p].x==n-1&&data[p].y==m-1)                {                    printf("It takes %d seconds to reach the target position, let me show you the way.\n",data[p].dis);                    print(p);                    return;                }                q.push(data[p]);                p++;            }        }    }    printf("God please help our poor hero.\n");}int main(){    char a[105];    while(scanf("%d%d",&n,&m)!=EOF)    {        memset(vis,0,sizeof(vis));        tot=1;        getchar();        for(int i=0;i<n;i++)        {            gets(a);            for(int j=0;j<m;j++)                map[i][j]=a[j];        }        bfs();        printf("FINISH\n");    }    return 0;}

原创粉丝点击