蓝桥杯2015决赛:穿越雷区(bfs广度优先搜索)

[蓝桥杯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;
}

在这里插入图片描述

发布了14 篇原创文章 · 获赞 3 · 访问量 543

猜你喜欢

转载自blog.csdn.net/qq_44577309/article/details/104269162