题意:
6 X 6的地图 格子和格子可能有墙 整个地图中有三道墙 求起点起点到终点的路径
本题中的墙可以理解为某a位置的X方向不能走 即用一个三维数组map[x][y][z]表示(x,y)的Z方向不能走
关于记录路径可以用一个pre数组记录每个坐标的前一个坐标的复合值 最后倒序输出方向即可
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node{
int x,y;
} head;
int pre[10][10];
int vis[10][10];
bool map[7][7][4]; //实现墙的功能
int dir[4][2]= {1,0,0,1,-1,0,0,-1};
char fx[3][3]; //存方向名称
int startx,starty,endx,endy;
void bfs()
{
queue<node>q;
vis[head.x][head.y]=1;
q.push(head);
while(!q.empty())
{
head=q.front();
q.pop();
if(head.x==endx&&head.y==endy)
{return;}
int tx,ty;
for(int i=0; i<4; i++)
{
tx=head.x+dir[i][0];
ty=head.y+dir[i][1];
if(tx<1||ty<1||tx>6||ty>6||vis[tx][ty]||map[head.x][head.y][i])
continue;
vis[tx][ty]=1;
pre[tx][ty]=head.x*7+head.y; //前一个坐标的负荷坐标
q.push( {tx,ty});
}
}
}
void output()
{
int i,j=0;
int tx,ty;
char q[49];
fx[1][0]='E';fx[0][1]='S';fx[1][2]='W';fx[2][1]='N'; //x y 加1避免越界
while(endx!=startx&&endy!=starty)
{
tx=pre[endx][endy]/7;
ty=pre[endx][endy]%7; //解密得前一个坐标
q[j++]=fx[tx-endx+1][ty-endy+1];
endx=tx;endy=ty;
}
for(j=j-2;j>=0;j--)
cout<<q[j];
cout<<endl;
return ;
}
int main()
{
while(scanf("%d%d",&head.y,&head.x)&&(head.x!=0))
{
scanf("%d%d",&endy,&endx);
memset(map,false,sizeof(map));
memset(pre,0,sizeof(pre));
memset(vis,0,sizeof(vis));
int i,j=3,ax,ay,bx,by,t;
while(j--) //实现墙的功能
{
scanf("%d%d%d%d",&ay,&ax,&by,&bx);
if(ay>by)
{t=ay;ay=by;by=t;}
if(ax>bx)
{t=ax;ax=bx;bx=t;}
if(ay==by)
{
for(i=ax+1; i<=bx; i++)
{
map[i][ay][1]=1;
map[i][ay+1][3]=1;
}
}
if(ax==bx)
{
for(i=ay+1; i<=by; i++)
{
map[ax][i][0]=1;
map[ax+1][i][2]=1;
}
}
}
bfs();
output();
}
return 0;
}