POJ-2935-Basic Wall Maze

来源:互联网 发布:福利ios直播软件 编辑:程序博客网 时间:2024/05/22 13:23

这个题用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 8using 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;}