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 
#include 
#include 
#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=0&&ny



你可能感兴趣的:(算法-搜索,搜索,杭电,bfs,穿越雷区)