思路:刚才在杭电上看到有个公共的比赛就点进去看了看看到了这个题,然后就做了。讲下思路, 这里的地图是有出了起点和中点是有两种样子。要不+要不-所以只要判断地图不相同就ok 如果相同就continue;用bfs做;
穿越雷区
X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
坦克车只能水平或垂直方向上移动到相邻的区。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
坦克车只能水平或垂直方向上移动到相邻的区。
Input
第一行输入一个整数T,表示测试数据的组数。
接下来有T组数据,
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
A,B都只出现一次。
接下来有T组数据,
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
A,B都只出现一次。
Output
要求每行输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1
如果没有方案,则输出-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);
}
}