这是我搞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;
}