标签:
这是我搞ACM这半年来做过最恶心的一题之一
这题思路其实很简单,只需注意要用优先队列和记录路径即可;
然后说说这题恶心的地方
首先是这坑爹的输出,简直了.然后注意第一个点和最后一个点也有可能发生战斗;
最后就是记录路径的方法,我是在结构体里定义数组然后传递下去(开始我把需要战斗的点用坐标的相反数表示结果和(0,0)产生了逻辑矛盾,之后我把需要战斗的点在记录坐标时候+200才解决);其实记录路径的方法有很多,这题也没卡这个,怎么顺手怎么来吧
wa了32次我也是醉了,给学姐丢脸了唉,面壁中..........
#include<iostream> #include<cmath> #include<queue> #include<cstring> #include<cstdio> #define maxn 105 #define maxnn 1000+5 using namespace std; char mapp[maxn][maxn]; int visit[maxn][maxn]; int n,m,re; int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; struct stu { int x,y; int s; int numx[maxnn]; int numy[maxnn]; friend bool operator<(stu x,stu y) { return x.s>y.s; } }; stu ree; void bfs() { stu x,y; priority_queue<stu>root; x.x=0;x.y=0; //x.s=0; //x.numx[x.s]=0; //x.numy[x.s]=0; if(mapp[x.x][x.y]=='.') x.s=0,x.numx[x.s]=0,x.numy[x.s]=0; else { x.s=mapp[x.x][x.y]-'0'; for(int i=0;i<=x.s;i++) { x.numx[i]=x.x+200; x.numy[i]=x.y+200; } } visit[0][0]=1; root.push(x); while(root.size()) { x=root.top(); root.pop(); if(x.x==n-1&&x.y==m-1) { if(re>x.s) { re=x.s; ree=x; } continue; } for(int i=0;i<4;i++) { y.x=x.x+dir[i][0]; y.y=x.y+dir[i][1]; y.s=x.s; for(int i=0;i<=x.s;i++) { y.numx[i]=x.numx[i]; y.numy[i]=x.numy[i]; } if(y.x<0||y.x>=n||y.y<0||y.y>=m||mapp[y.x][y.y]=='X'||visit[y.x][y.y]){continue;} if(mapp[y.x][y.y]=='.') { y.s++; y.numx[y.s]=y.x; y.numy[y.s]=y.y; } else { y.s+=mapp[y.x][y.y]-'0'+1; y.numx[x.s+1]=y.x; y.numy[x.s+1]=y.y; for(int i=x.s+2;i<=y.s;i++) { y.numx[i]=200+y.x; y.numy[i]=200+y.y; } } root.push(y); visit[y.x][y.y]=1; } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0;i<n;i++) cin>>mapp[i]; re=1<<20; memset(visit,0,sizeof(visit)); bfs(); if(re==1<<20) { cout<<"God please help our poor hero."<<endl; cout<<"FINISH"<<endl; } else { cout<<"It takes "<<re<<" seconds to reach the target position, let me show you the way."<<endl; for(int i=1;i<=ree.s;i++) { cout<<i<<"s:"; if(ree.numx[i]<200) { cout<<"("<<ree.numx[i-1]%200<<","<<ree.numy[i-1]%200<<")"<<"->("<<ree.numx[i]<<","<<ree.numy[i]<<")"<<endl; } else { cout<<"FIGHT AT ("<<ree.numx[i]-200<<","<<ree.numy[i]-200<<")"<<endl; } } cout<<"FINISH"<<endl; } } return 0; }
hdu 1026 Ignatius and the Princess I
标签:
原文地址:http://blog.csdn.net/zafkiel_nightmare/article/details/44836579