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;}