http://poj.org/problem?id=3083
题目不难 就是繁琐呀
代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<queue>
#include<stack>
#include <iomanip>
using namespace std;
#define LL long long
#define sint short int
const int INF=0x3f3f3f3f;
//priority_queue<int,vector<int>,greater<int> >qt;
const int N=50;
char graph[N][N];
typedef pair<int,int>point;
queue<point>qt;
int dist[N][N];
bool in[N][N];
int X[]={-1,0,1,0};
int Y[]={0,1,0,-1};
int n,m;
bool OK(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m&&graph[x][y]!='#')
return true;
return false;
}
int spfa(int sx,int sy,int ex,int ey)
{
memset(in,false,sizeof(in));
memset(dist,-1,sizeof(dist));
qt.push(point(sx,sy));
in[sx][sy]=true;
dist[sx][sy]=1;
while(!qt.empty())
{
int x=qt.front().first;
int y=qt.front().second;
in[x][y]=false;
qt.pop();
for(int i=0;i<4;++i)
{
int l1=x+X[i];
int l2=y+Y[i];
if(OK(l1,l2)&&(dist[l1][l2]==-1||dist[l1][l2]>dist[x][y]+1))
{
dist[l1][l2]=dist[x][y]+1;
if(!in[l1][l2])
{
in[l1][l2]=true;
qt.push(point(l1,l2));
}
}
}
}
return dist[ex][ey];
}
int Lsearch(int sx,int sy,int ex,int ey,int t)
{
int step=1;
int kx=sx,ky=sy;
while(true)
{
if(kx==ex&&ky==ey)
break;
bool flag=false;
for(int i=(t+3)%4,j=0;j<4;++j,i++)
{
int l=(i+4)%4;
int l1=kx+X[l];
int l2=ky+Y[l];
if(OK(l1,l2))
{kx=l1;ky=l2;t=l;++step;flag=true;break;}
}
if(flag==false)
return INF;
}
return step;
}
int Rsearch(int sx,int sy,int ex,int ey,int t)
{//cout<<kx<<" "<<ky<<" "<<t<<endl;
int step=1;
int kx=sx,ky=sy;
while(true)
{//cout<<kx<<" "<<ky<<" "<<t<<endl;
if(kx==ex&&ky==ey)
break;
bool flag=false;
for(int i=(t+1)%4,j=0;j<4;++j,i--)
{
int l=(i+4)%4;
int l1=kx+X[l];
int l2=ky+Y[l];
if(OK(l1,l2))
{kx=l1;ky=l2;t=l;++step;flag=true;break;}
}
if(flag==false)
return INF;
}
return step;
}
int main()
{
//freopen("data.in","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int sx,sy,ex,ey;
scanf("%d %d",&m,&n);
getchar();
for(int i=0;i<n;++i)
gets(graph[i]);
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
if(graph[i][j]=='S')
{sx=i;sy=j;}
else if(graph[i][j]=='E')
{ex=i;ey=j;}
int ans1=INF,ans2=INF,ans3;
//cout<<sx<<" "<<sy<<" "<<ex<<" "<<ey<<endl;
for(int i=0;i<4;++i)
{
ans1=min(ans1,Lsearch(sx,sy,ex,ey,i));
ans2=min(ans2,Rsearch(sx,sy,ex,ey,i));
}
ans3=spfa(sx,sy,ex,ey);
printf("%d %d %d\n",ans1,ans2,ans3);
}
return 0;
}