这个题用BFS搜索,题目大意是给你6*6的网格,其中第一行的2个数据表示起点,第二行的2个数据表示终点,第三行开始有3行,表示一道墙(可以当作一条线),有墙的地方相应不能通过。主要就是对墙需要特殊处理下。我采用的是用数组存是否该点能够上下左右通行,如果不能则map[i][j][k]=1(i,j)为该点坐标。求起点到终点的路线,用N,E,S,W代表东西南北,表示走的方向。
处理方法:
1、首先对网格周围一圈进行特殊处理
2、对于墙有2种可能
a、x坐标相同,则处理左右两边。
b、y坐标相同,则处理上下两边。
3、我是先找到最快到达终点的路线,然后回朔确定具体的路线,最后反向输出即为答案。
处理的时候注意按照题中所画的形式,否则可能会造成方向上的错误。
直接贴代码吧,还是比较简单:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#define MAX 8
using namespace std;
int map[MAX][MAX][4],use[MAX][MAX],px[MAX][MAX],py[MAX][MAX],pos[MAX][MAX];//上右下左
int sx,sy,ex,ey,movex[4]={0,1,0,-1},movey[4]={-1,0,1,0};
char ways[5]={"NESW"};
int main()
{
while(scanf("%d%d",&sx,&sy)&&(sx||sy))
{
memset(map,0,sizeof(map));
memset(use,0,sizeof(use));
for(int i=0;i<7;i++)
map[1][i][0]=map[6][i][2]=1;
for(int i=0;i<7;i++)
map[i][1][3]=map[i][6][1]=1;
scanf("%d%d",&ex,&ey);
for(int i=0;i<3;i++)
{
int ax,ay,bx,by;
scanf("%d%d%d%d",&ax,&ay,&bx,&by);
if(ax==bx)
{
if(ax>0)
{
for(int j=min(ay,by)+1;j<=max(ay,by);j++)
map[j][ax][1]=1;
}
if(ax<6)
for(int j=min(ay,by)+1;j<=max(ay,by);j++)
map[j][ax+1][3]=1;
}
else
{
if(ay>0)
for(int j=min(ax,bx)+1;j<=max(ax,bx);j++)
map[ay][j][2]=1;
if(ay<6)
for(int j=min(ax,bx)+1;j<=max(ax,bx);j++)
map[ay+1][j][0]=1;
}
}
queue<int> x,y;
x.push(sx);
y.push(sy);
use[sy][sx]=1;
int flag=0;
while(!x.empty())
{
int itx=x.front();
x.pop();
int ity=y.front();
y.pop();
for(int i=0;i<4;i++)
{
if(map[ity][itx][i])
continue;
int xx=itx+movex[i];
int yy=ity+movey[i];
if(use[yy][xx])
continue;
px[yy][xx]=itx;
py[yy][xx]=ity;
pos[yy][xx]=i;
use[yy][xx]=1;
x.push(xx);
y.push(yy);
if(xx==ex&&yy==ey)
{
flag=1;
break;
}
}
if(flag)
break;
}
int itx=ex,ity=ey,cou=0;
char ans[300];
while(!(itx==sx&&ity==sy))
{
ans[cou++]=ways[pos[ity][itx]];
int ita=px[ity][itx],itb=py[ity][itx];
itx=ita,ity=itb;
}
for(int i=cou-1;i>=0;i--)
printf("%c",ans[i]);
printf("\n");
}
return 0;
}