题目描述
汪某人最近研发了一个新式坦克,他取名为汪式坦克。但是汪式坦克很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
现在有一辆汪式坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
已知的地图是一个n×m的方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
输入描述
测试样例由多组测试数据组成,每组测试样例第一行输入两个正整数n和m ( 1≤ n,m≤100) 代表地图的行数和列数。接下来输入n行字符串,每行字符串只由A,B,+,-四种字符组成。A代表起始点,B代表结束点,+号代表正能量区,-号代表负能量区。
输出描述
输出坦克从A区到达B区的最短移动次数,如果坦克始终不能从A区到达B区,则输出−1
测试样例1
输入
5 5
A+-+-
-+--+
-+++-
+-+-+
B+-+-
输出
10
题解:
#include <bits/stdc++.h>
using namespace std;
int n,m;//输入行列
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};//方向数组
char s[105][105];//二维数组存储+ -
int vis[105][105];//记录位置被访问过
queue<pair<int,int> > q;// 存储行列坐标
int bfs(){
int sum=0;//计算次数
while(!q.empty()){//不断取出队列里的位置直到空
int len=q.size();
for(int i=0;i<len;i++){//遍历当前队列所有位置
int x=q.front().first;
int y=q.front().second;
q.pop();
char tmp=s[x][y];//记录当前+ -
if(tmp=='B')return sum;//如果是B输出次数
for(int j=0;j<4;j++){//根据当前位置计算下个位置坐标
int tx=x+dir[j][0];
int ty=y+dir[j][1];
if(tx>=0 && ty>=0 && tx<n && ty<m && vis[tx][ty]==0){//检查下一个位置是否在地图内且未被访问
if(s[tx][ty]!=tmp ){
vis[tx][ty]=1;//标记访问
q.push({tx,ty});//下个位置与当前不同压入队列
}
}
}
}
sum++; //次数jiajia
}
return -1;//跑完没有找到b输出-1
}
int main(){
while(cin>>n>>m){
memset(vis,0,sizeof(vis)); //重置
while(!q.empty())q.pop();//重置
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>s[i][j];//二维数组输入
if(s[i][j]=='A'){
q.push({i,j});//是A压入队列代表起始位置
}
}
}
cout<<bfs()<<endl;//输出结果
}
return 0;
}