bfs 穿越雷区 杭电题目

思路:刚才在杭电上看到有个公共的比赛就点进去看了看看到了这个题,然后就做了。讲下思路, 这里的地图是有出了起点和中点是有两种样子。要不+要不-所以只要判断地图不相同就ok 如果相同就continue;用bfs做;

穿越雷区

X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?

已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -

坦克车只能水平或垂直方向上移动到相邻的区。


Input


第一行输入一个整数T,表示测试数据的组数。
接下来有T组数据,
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
A,B都只出现一次。


Output


要求每行输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1

代码 :唉 !一直用的是c语言用的是自己的队列。
所以这代码有点长。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define QUEUELEN 100000
//数据结构的定义
typedef struct
{
    int x;
    int y;
    int pre;
}DATA;
int m,n;
char  map[401][401];
typedef struct
{
    DATA data[QUEUELEN];
    int head;
    int tail;
}SQType;
//队列的初始化
SQType *SQTypeInit()
{
    SQType *q;
    if(q=(SQType *)malloc(sizeof(SQType)))
    {
        q->head=0;
        q->tail=0;
        return q;
    }
    else
    {
        return NULL;
    }
}
//判断空队列
int SQTypeIsEmpty(SQType *q)
{
    int temp;
    temp=q->head==q->tail;
    return temp;

}

//判断满队列
int SQTypeisFull(SQType *q)
{
    int temp;
    temp=q->tail==QUEUELEN;
    return temp;

}

//清空队列
void SQTypeClear(SQType *q)
{
    q->head=0;
    q->tail=0;
}

//释放空间
void SQTypeFree(SQType *q)
{
    if (q!=NULL)
    {
        free(q);
    }
}

//入队
int InSQType(SQType *q,DATA data)
{
    if (q->tail==QUEUELEN)
    {
        printf("队列满鸟。。。");
        return 0;
    }
    else
    {
        q->data[q->tail++]=data;
        return 1;
    }
}

//出队列
int  OutSQType(SQType *q,DATA &a)
{
    if(q->head==q->tail)
    {
       printf("亲,队列是空的。。。");
       return 0;
    }
    else
{  a= q->data[q->head++];

   return 1;

    }

}

//读取节点的数据
DATA *PeekSQType(SQType *q)
{
  if(SQTypeIsEmpty(q))
  {
      printf("\n这个队列是空的啊。。。\n");
      return NULL;
  }
  else
  {
      return &(q->data[q->head]);
  }
}

//计算队列的长度
int SQTypeLen(SQType *q)
{
  int temp;
  temp=q->tail-q->head;
  return temp;
}

int c,zx,zy;
int bfs(int x,int y)
{

 int dir[4][2]={1,0,-1,0,0,1,0,-1};
 int flag[401][401]={0};
   SQType *migong=SQTypeInit();
   DATA a={x,y,0};
   flag[x][y]=1;
   InSQType(migong,a);
   while(!SQTypeIsEmpty(migong))
   {
       OutSQType(migong,a);

       for(int i=0;i<4;i++)
       {
           int nx=a.x+dir[i][0];
           int ny=a.y+dir[i][1];
           if(!(nx>=0&&nx<n&&ny>=0&&ny<m)) continue;
           if(map[nx][ny]==map[a.x][a.y]) continue;//判断前一步跟后一步的地图是不是相同。
           if(nx==zx&&ny==zy){ printf("%d\n",a.pre+1);return 1;}
                    if(!flag[nx][ny])
                      {


                            DATA n;
                            n.pre=a.pre+1;
                            n.x=nx;
                            n.y=ny;
                            flag[nx][ny]=1;
                            InSQType(migong,n);

                        }



        }


   }
   printf("-1\n");

 }


int main()
{int x,y;
 int  t;
 scanf("%d",&t);
    while(t--)
    {   scanf("%d",&n);
        m=n;
        getchar();
         c=0;
        for(int i=0;i<n;i++)
         {for(int j=0;j<m;j++)
           {
            scanf("%c",&map[i][j]);
            getchar();
            if(map[i][j]=='A') x=i,y=j;
            if(map[i][j]=='B') zx=i,zy=j;

           }

         }
          /*for(int i=0;i<n;i++)
         {for(int j=0;j<m;j++)
           {
            printf("%c ",map[i][j]);


           }
           printf("\n");

         }*/
         bfs(x,y);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值