可以将图看成每一条边都是一个节点,这样就将6*6的图构成13*13的一个图,然后模拟即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<list>
#include<queue>
#define mm(a,b) memset(a,b,sizeof(a))
#define ACCELERATE (ios::sync_with_stdio(false),cin.tie(0))
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
using namespace std;
struct node{
int x;
int y;
string s;
node(int a,int b):x(a),y(b){}
};
int main()
{
bool vis[13][13];
int sx,sy,ex,ey;
while(scanf("%d%d",&sy,&sx)!=EOF&&(sy||sx)){
scanf("%d%d",&ey,&ex);
mm(vis,0);
sy=2*sy-1;
sx=2*sx-1;
ex=2*ex-1;
ey=2*ey-1;
for(int i=0;i<13;i++){
vis[0][i]=1;
vis[i][0]=1;
vis[i][12]=1;
vis[12][i]=1;
}
int a,b,c,d;
for(int i=0;i<3;i++){
scanf("%d%d%d%d",&a,&b,&c,&d);
a*=2;b*=2;c*=2;d*=2;
if(a==c){
for(int j=b;j<=d;j++){
vis[j][a]=1;
}
}
if(b==d){
for(int j=a;j<=c;j++){
vis[b][j]=1;
}
}
}
queue<node> q;
q.push(node(sx,sy));
while(1){
node t=q.front();
q.pop();
if(t.x==ex&&t.y==ey){
printf("%s\n",t.s.c_str());
break;
}
if(!vis[t.x][t.y+1]){
node f(t.x,t.y+2);
f.s=t.s+"E";
q.push(f);
vis[t.x][t.y+1]=1;
vis[t.x][t.y+2]=1;
}
if(!vis[t.x][t.y-1]){
node f(t.x,t.y-2);
f.s=t.s+"W";
q.push(f);
vis[t.x][t.y-1]=1;
vis[t.x][t.y-2]=1;
}
if(!vis[t.x+1][t.y]){
node f(t.x+2,t.y);
f.s=t.s+"S";
q.push(f);
vis[t.x+1][t.y]=1;
vis[t.x+2][t.y]=1;
}
if(!vis[t.x-1][t.y]){
node f(t.x-2,t.y);
f.s=t.s+"N";
q.push(f);
vis[t.x-1][t.y]=1;
vis[t.x-2][t.y]=1;
}
}
}
return 0;
}