[蓝桥杯2015决赛]穿越雷区
- Description
X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
坦克车只能水平或垂直方向上移动到相邻的区。
- Input
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
输入保证A,B都只出现一次。
- Output
要求输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1
分析
最短路径,大部分都用bfs。
- AC代码
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
int n;
const int ax[4]={1,0,0,-1}; //控制x的方向
const int ay[4]={0,-1,1,0}; //控制y的方向
char mmap[105][105]; //存地图
int vis[105][105]={0};//记录是否遍历过
using namespace std;
struct point {
int x,y,step;
point(int a,int b,int c):x(a),y(b),step(c){}
};
void bfs(int x,int y)
{
queue<point>p;
p.push(point(x,y,0));
vis[x][y]=1;
while(!p.empty())
{ //不为空
point temp=p.front(); //记录队头
p.pop(); //队头出队
if(mmap[temp.x][temp.y]=='B') //如果已经到出口,则结束
{
cout<<temp.step<<endl; //输出
return ;
}
for(int i=0;i<4;i++) //bfs搜索 -下左右上
{
int tempx=temp.x+ax[i];
int tempy=temp.y+ay[i];
if(tempx>=1&&tempy<=n&&tempy>=1&&tempy<=n&&!vis[tempx][tempy]&&mmap[tempx][tempy]!=mmap[temp.x][temp.y]) //
{
vis[tempx][tempy]=1; //标记已经走过
p.push(point(tempx,tempy,(temp.step+1)));
}
}
}
cout<<-1<<endl;//队列全部走完还没输出,则输出-1
}
int main()
{
int sx,sy,i,j;// 起点
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cin>>mmap[i][j];
if(mmap[i][j]=='A')
sx=i,sy=j;
}
//cout<<sx<<" "<<sy<<endl;
bfs(sx,sy);
return 0;
}