标签:c++
题意:
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; }
POJ2935 Basic Wall Maze bfs记录路径
标签:c++
原文地址:http://blog.csdn.net/axuan_k/article/details/42918125