看了别人的代码才想到用优先队列,之前代码写的太少,到需要用的时候总是容易忘。
第一次提交的时候可能是杭电那会儿同时提交的人多,直接给我判了超时,后来又提交了一次,984ms,勉勉强强算是过了。
学着学着就忍不住觉得悲伤,我总是以一种我学习所远远不能达到的速度去发现我还有那么多东西没有学好。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define N 1005
int map[N][N];
int m,n;
int a,b,x1,y1;
int dir[4][2]={1,0, -1,0, 0,1, 0,-1};
struct node
{
int x,y;
int step;
friend bool operator<(node a1,node a2)
{
return a2.step<a1.step;
}
};
node cur,next;
int judge(int x,int y)
{
if(x>=1&&x<=m&&y>=1&&y<=n&&map[x][y]!=-1)
return 1;
return -1;
}
int bfs()
{
int i;
int x,y;
priority_queue<node>q;
cur.x=a;
cur.y=b;
cur.step=0;
map[a][b]=-1;
q.push(cur);
while(!q.empty())
{
cur=q.top();
if(cur.x==x1&&cur.y==y1)
return cur.step;
q.pop();
for(i=0;i<4;i++)
{
next.x=x=cur.x+dir[i][0];
next.y=y=cur.y+dir[i][1];
if(judge(x,y)==-1)
continue;
if(map[x][y]==0)
next.step=cur.step+1;
else
next.step=cur.step;
map[x][y]=-1;
q.push(next);
}
}
return -1;
}
int main()
{
int i,j;
int ans;
char c;
while(scanf("%d%d",&m,&n),m||n)
{
getchar();
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
scanf("%c",&c);
if(c=='X')
map[i][j]=1;
else
map[i][j]=0;
}
getchar();
}
scanf("%d%d",&a,&b);
scanf("%d%d",&x1,&y1);
if(a==x1&&b==y1)
{
printf("0\n");
continue;
}
ans=bfs();
printf("%d\n",ans);
}
return 0;
}