还是典型的BFS。只加了一些限制条件而已。每道墙可以转化为从某格不能移动到某格。
最后要求打印出路径,用一个数组保存路径,递归实现打印。
虽然是1Y却憋了挺长时间,还是说明了我很水。。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
bool vis[10][10];
bool sp[10][10][10][10];
struct Grid
{
int x,y;
Grid(int a=0,int b=0):x(a),y(b) {}
bool operator== (Grid &t)
{
if(x==t.x&&y==t.y) return true;
return false;
}
};
bool Judge(int x,int y)
{
if(1<=x&&x<=6&&1<=y&&y<=6) return true;
return false;
}
int m[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
int dir[10][10];
Grid last_grid[10][10];
void Print(Grid p,Grid st)
{
if(p==st) return ;
Print(last_grid[p.x][p.y],st);
if(dir[p.x][p.y]==0) putchar('S');
else if(dir[p.x][p.y]==1) putchar('N');
else if(dir[p.x][p.y]==2) putchar('E');
else if(dir[p.x][p.y]==3) putchar('W');
}
int main()
{
int sx,sy;
while(scanf("%d%d",&sx,&sy)&&!(!sx&&!sy))
{
int ex,ey;
scanf("%d%d",&ex,&ey);
memset(sp,0,sizeof(sp));
for(int i=0; i<3; ++i)
{
int ax,ay,bx,by;
scanf("%d%d%d%d",&ax,&ay,&bx,&by);
if(ax==bx)
{
int mn=min(ay,by),mx=max(ay,by);
for(int j=mn+1; j<=mx; ++j)
sp[j][ax][j][ax+1]=sp[j][ax+1][j][ax]=true;
}
else if(ay==by)
{
int mn=min(ax,bx),mx=max(ax,bx);
for(int j=mn+1; j<=mx; ++j)
sp[ay][j][ay+1][j]=sp[ay+1][j][ay][j]=true;
}
}
bool ok=false;
queue<Grid> q;
Grid st(sy,sx);
memset(dir,0,sizeof(dir));
memset(vis,0,sizeof(vis));
q.push(st);
while(!q.empty()&&!ok)
{
Grid t=q.front();
q.pop();
for(int i=0; i<4; ++i)
{
int xx=t.x+m[i][0],yy=t.y+m[i][1];
if(!Judge(xx,yy)) continue;
if(!vis[xx][yy]&&!sp[t.x][t.y][xx][yy])
{
last_grid[xx][yy]=t;
dir[xx][yy]=i;
vis[xx][yy]=true;
if(xx==ey&&yy==ex)
{
ok=true;
break;
}
q.push(Grid(xx,yy));
}
}
}
Grid ed(ey,ex);
Print(ed,st);
printf("\n");
}
return 0;
}