数字代表怪兽,求起点到终点的最少时间。
既然这样就是个裸的广搜,每次走路的代价从1变成打怪需要时间+1(上一步到这里需要的时间)就好了。。。其他照旧,用于广搜的队列变成优先队列,也就是本来是按先后入队列的顺序搜索,变成了每次找到最小花费时间往后搜索,不过感觉很奇怪的是,这样一来一些次要路径在正确路径的时间增长后也会被拿出来继续搜索,啊不过这不就是搜索的过程吗,未用优先队列的搜索将不是最少时间,而是最短路径,打的怪少用的时间多,用了优先队列后将多次拿出最小花费时间来继续搜索,最终我们需要的结果即是队列中花费最小的那条路径,取出保证了其时间小,到达点是W(出口)表示以此最小时间找到了终点。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int walkx[]= {1,-1,0,0};
int walky[]= {0,0,1,-1};
struct point
{
int x,y,ans;
bool operator <(const point &a)const
{
return ans>a.ans;
}
} st,ed;
char ma[208][208];
bool vis[208][208];
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
memset(vis,false,sizeof(vis));
scanf("%d%d",&n,&m);
getchar();
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
scanf("%c",&ma[i][j]);
if(ma[i][j]=='Z')st.x=i,st.y=j;
if(ma[i][j]=='W')ed.x=i,ed.y=j;
}
getchar();
}
priority_queue<point>q;
while(!q.empty())q.pop();
int ans=0x7fffffff;
vis[st.x][st.y]=true;
st.ans=0;
q.push(st);
bool flag=false;
while(!q.empty())
{
point tmp,top=q.top();
q.pop();
for(int i=0; i<4; i++)
{
tmp.x=top.x+walkx[i];
tmp.y=top.y+walky[i];
tmp.ans=top.ans+1;
if(ma[tmp.x][tmp.y]>='0'&&ma[tmp.x][tmp.y]<='9') tmp.ans+=ma[tmp.x][tmp.y]-'0';
if(ma[tmp.x][tmp.y]=='W')
{
ans=tmp.ans;
flag=true;
break;
}
if(tmp.x>=0&&tmp.y>=0&&tmp.x<n&&tmp.y<m&&!vis[tmp.x][tmp.y]&&ma[tmp.x][tmp.y]!='#')
{
vis[tmp.x][tmp.y]=true;
q.push(tmp);
}
}
if(flag)break;
}
if(ans==0x7fffffff)printf("IMPOSSIBLE
");
else printf("%d
",ans);
}
}