http://acm.hdu.edu.cn/showproblem.php?pid=4198
题意:
给出h*w的图 图中'@'表示桥 给出通过桥的时间k
求最短离开的时间
代码:
#include<iostream>
#include<string>
#include<queue>
#define MAX 502
using namespace std;
struct node
{
int x,y,time;
friend bool operator < (node a,node b) //时间小的优先级高
{
return a.time>b.time;
}
};
priority_queue<node> q;
char map[MAX][MAX];
char vist[MAX][MAX];
int h,w,d;
int s_x,s_y;
int dir[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
int BFS()
{
node now,next;
while(!q.empty()) q.pop();
memset(vist,0,sizeof(vist));
now.x=s_x;
now.y=s_y;
now.time=0;
q.push(now);
vist[s_x][s_y]=1;
while(!q.empty())
{
now=q.top();
q.pop();
for(int i=0;i<4;i++)
{
next.x=now.x+dir[i][0];
next.y=now.y+dir[i][1];
next.time=now.time+1;
if(next.x<0 || next.x>=h || next.y<0 || next.y>=w) return next.time;
if(map[next.x][next.y]=='#' || vist[next.x][next.y]) continue;
if(map[next.x][next.y]=='@')
{
next.time+=d;
q.push(next);
vist[next.x][next.y]=1;
}
else if(map[next.x][next.y]=='.')
{
q.push(next);
vist[next.x][next.y]=1;
}
}
}
return -1;
}
int main()
{
int t;
while(cin>>t!=NULL)
{
while(t--)
{
cin>>h>>w>>d;
for(int i=0;i<h;i++)
{
cin>>map[i];
for(int j=0;j<w;j++)
if(map[i][j]=='S')
{
s_x=i;
s_y=j;
}
}
int ans=BFS();
cout<<ans<<endl;
}
}
return 0;
}
思路:
BFS+优先队列
时间小的优先级高 优先出队