hdu 2822 Dogs (BFS+优先队列)
题意:已知起点和终点,找出最挖洞最少的路径
普通的BFS()就可以了,我想说,天呐,我忘记清空队列 ,模拟赛时候狂WA了
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int vis[1001][1001],n,m,si,sj,ei,ej,ans;
char g[1001][1001];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct state
{
int x,y,cnt;
state(int _x=0,int _y=0,int _cnt=0):x(_x),y(_y),cnt(_cnt){};
friend bool operator <(const state &a,const state &b)
{
return a.cnt>b.cnt;
}
};
priority_queue<state> Q;
void BFS()
{
Q.push(state(si,sj,0));
vis[si][sj]=0;
state tmp;
while(!Q.empty())
{
tmp=Q.top();
Q.pop();
if(tmp.x==ei && tmp.y==ej)
{
ans=tmp.cnt;
return ;
}
for(int k=0;k<4;k++)
{
int i=tmp.x+dir[k][0];
int j=tmp.y+dir[k][1];
int t;
if(i>n || i<1|| j>m || j<1)
continue;
if(g[i][j]=='X')
t=tmp.cnt;
else t=tmp.cnt+1;
if(vis[i][j]>t)
{
vis[i][j]=t;
Q.push(state(i,j,t));
}
}
}
}
int main()
{
while(scanf("%d %d",&n,&m)==2 &&(n||m))
{
getchar();
for(int i=1;i<=n;i++)
{
gets(g[i]+1);
for(int j=1;j<=m;j++)
{
//scanf("%c",&g[i][j]);
vis[i][j]=INT_MAX;
}
}
scanf("%d %d",&si,&sj);
scanf("%d %d",&ei,&ej);
ans=-1;
while(!Q.empty())
Q.pop();
BFS();
printf("%d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号