http://poj.org/problem?id=1101
【思路】:本题较为简单,求最短路段,可用BFS解决,例外处理好地图描述的字符即可。
【注意】:本题的路可以在在给定的地图外走,如:W=5,H=4,则可选的路范围为0<=w<=W+1,0<=h<=H+1;另外注意每一组测试数据在输出结果后要输出一行空行
【代码】:不会写排版插件,所以。。。代码凑合着看吧
#include<stdio.h>
#include<string>
#include<queue>
using namespace std;
char map[100][100];
int w,h,Min;
bool u[100][100];
//dir记录该节点是由上一节点从哪个方向来的,以便于区分是否方向发生转变
//seg记录该节点属于第几个路段
struct node
{
int x,y,dir,seg;
};
int d[4][2]={0,1,0,-1,1,0,-1,0};
int in(int x,int y)
{
if(x<0||x>h+1||y<0||y>w+1)
return 0;
return 1;
}
void bfs(int bx,int by,int ex,int ey)
{
memset(u,0,sizeof(u));
queue<node>q;
int x,y,i,cont=0,newseg;
node now;
node bow;
now.x=bx;
now.y=by;
now.dir=-1;
now.seg=0;
q.push(now);
u[bx][by]=1;
while(!q.empty())
{
now=q.front();
q.pop();
for(i=0;i<4;i++)
{
x=now.x+d[i][0];
y=now.y+d[i][1];
if(in(x,y)&&(map[x][y]==' '||(x==ex&&y==ey)))
{
if(now.dir==-1)
newseg=1;
else//如果方向一致则不需新加路段数,否则路段数加1
(now.dir!=i) ? newseg=now.seg+1 : newseg=now.seg;
if(x==ex&&y==ey)
{
if(newseg<Min)
Min=newseg;
//continue;
return;
}
if(!u[x][y])
{
bow.x=x;
bow.y=y;
bow.dir=i;
bow.seg=newseg;
q.push(bow);
u[x][y]=1;
}
}
}
}
}
int main()
{
int i,j,c=1,ans,cc=0;
int bx,by,ex,ey;
while(scanf("%d%d",&w,&h)&&w&&h)
{
memset(map,' ',sizeof(map));
cc=0;
for(i=1;i<=h;i++)
{
getchar();
for(j=1;j<=w;j++)
map[i][j]=getchar();
}
printf("Board #%d:\n",c);
while(scanf("%d%d%d%d",&by,&bx,&ey,&ex))
{
if(!bx&&!by&&!ex&&!ey)
break;
cc++;
Min=1<<30;
bfs(bx,by,ex,ey);
if(Min!=1<<30)
printf("Pair %d: %d segments.\n",cc,Min);
else
printf("Pair %d: impossible.\n",cc);
}
printf("\n");
c++;
}
return 0;
}