【思特奇杯·云上蓝桥-算法集训营】第2周 穿越雷区

题目描述

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

例如:

A + - + -

+ - - +

- + + + -

+ - + - +

B + - + -

坦克车只能水平或垂直方向上移动到相邻的区。

数据格式要求:

输入第一行是一个整数n,表示方阵的大小, 4<=n<100

接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。

A,B都只出现一次。

要求输出一个整数,表示坦克从A区到B区的最少移动步数。

如果没有方案,则输出-1

例如:

用户输入:

5

A + - + -

- + - - +

- + + + -

+ - + - +

B + - + -

则程序应该输出:

10

资源约定:

峰值内存消耗 < 512M

CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0

注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。

注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程

这个问题是个走迷宫求最短步数问题,我们很容易能想到通过bfs来进行。

我在做题的时候遇到的阻碍,不是算法之类的。反而是最基础的c和c++语言方面的问题。

如何将地图的信息作为一个二维数组进行储存。我当时想的是地图里面含有空格,储存的过程肯定要有消去空格这一步。用了scanf(“%c”);结果,很显然地图储存失败。原因是既忘了这个函数本身就可以忽略空格。又忘了消去换行符。最后,我使用了scanf(“ %c”);这种类型。

当然,为什么不用cin 直接存储。它既能够消去空格,又能够消去换行符等tab之类的键。不更好吗?

这个是因为 cin的存储效率是要小于scanf的,这是一个程序问题,要考虑到时间。为了保险起见我没有使用这个函数。当然如果是填空的话,我还是非常推荐使用这个函数的。能够很大程度上减少你的代码量。

代码如下:(通过了oj

#include <iostream>
#include <queue>
using namespace std;
struct point {
    int x;
    int y;
    int step;
};
char map[100][100];
int color[100][100]={0};  // 标记地图是否走过。
int n;

int main(){
    void bfs(point s);
    point s;
    cin >> n;
    for(int j=0;j<n;j++){
        for(int i=0;i<n;i++){   
           
            scanf(" %c",&map[j][i]);
            if(map[j][i]=='A'){
                s.x=j;
                s.y=i;
                s.step=0;
            }
        }
    }
    bfs(s);
    
    return 0;
    

}
void bfs(point s){
    queue<point> a;
    a.push(s);
    color[s.x][s.y]=1;
    
    while(!a.empty()){
        point now=a.front();
        a.pop();

        if(map[now.x][now.y]=='B'){
            cout << now.step;
            return ;
        }

        point next[4];

        for(int i=0;i<4;i++){
            if(i==0){
                next[i].x=now.x+1;
                next[i].y=now.y;
            }
            else if(i==1){
                next[i].x=now.x-1;
                next[i].y=now.y;
            }
            else if(i==2){
                next[i].x=now.x;
                next[i].y=now.y+1;
            }
            else if(i==3){
                next[i].x=now.x;
                next[i].y=now.y-1;
            }

            next[i].step=now.step+1;
        }

        for(int i=0;i<4;i++){
            if(next[i].x>=0&&next[i].x<n &&next[i].y>=0&&next[i].y<n && map[now.x][now.y]!=map[next[i].x][next[i].y] && !color[next[i].x][next[i].y]){
                
                color[next[i].x][next[i].y]=1;
                a.push(next[i]);
            
            }
        }
    }

    cout << -1 ;
    return;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值