POJ 1101

来源:互联网 发布:js获取文件大小 编辑:程序博客网 时间:2024/05/20 12:24

     【题意】:给出一个地图,标有X的地方不能经过,给出一对坐标,问这对坐标能否相连通,如果能则输出最少要经过的路段(路段是指一段直线,如果中途发生转折则就是两个路段);如果不能则输出impossible。

   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;
}

原创粉丝点击