C++汪式坦克

题目描述

汪某人最近研发了一个新式坦克,他取名为汪式坦克。但是汪式坦克很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。

现在有一辆汪式坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?

已知的地图是一个n×m的方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。

输入描述

测试样例由多组测试数据组成,每组测试样例第一行输入两个正整数nm ( 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;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值