[算法设计与分析]Bao 解题报告

Problem

宝葫芦被放在一个城堡里。城堡由n*m个方格组成,你只能从当前所在的方格跳到相邻的4个方格里,而且不能跳出城堡的范围。城堡中某些方格里有弹簧,每个弹簧具有一个特定能量p,不同弹簧的p值不一定相同。如果你跳到一个有弹簧的方格,就会立刻沿着原来运动的方向继续跳p格,如果跳到的方格里又有弹簧,就马上继续跳,直到跳到一个空的方格或者被墙挡住无法继续前进为止。你能否尽快找到宝葫芦吗?

输入:第一行有两个整数,n和m(3=<n,m<=100),分别是城堡的行数和列数。其后是一个非负整数k,表示弹簧的个数。在接下来的k行里,每行有三个正数x, y, p,以空格隔开,其中x和y是弹簧的坐标(2=<x<=n-1, 2=<y<=m-1),p是弹簧的能量。在下面的两行里,分别是你和宝葫芦的坐标。此外,你在空中经过的弹簧对你没有任何影响。已知你、宝葫 芦和弹簧的初始位置都不同。x坐标轴的范围是1到n,y坐标轴的范围是1到m。 输出: 最少的步数,或者impossible

注意:输入有多组用例。

test input

10 10
2
2 7 5
2 3 3
2 8
1 1

test output

3

ac code

//
//  main.cpp
//  bao
//
//  Created by jetviper on 2017/3/29.
//  Copyright © 2017年 jetviper. All rights reserved.
//

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include<iostream>

static int cb[200][101];
int n, m;
int dx[4] = { -1,1,0,0 };
int dy[4] = {0,0,-1,1};

void bfs(int fx,int x, int y,int step) {
    if (x<1 || y<1 || x>n || y>m) {
        
        if (x<1) {
            bfs(fx, 1, y, step);
        }
        
        if (y<1) {
            bfs(fx, x, 1, step);
        }
        if (x>n) {
            bfs(fx, n, y, step);
        }
        if (y>m) {
            bfs(fx, x, m, step);
        }
        return;
    }
    
    
    if (cb[x][y]<0) {
        switch (fx) {
            case 0:
                bfs(fx, x + cb[x][y], y, step);
                break;
            case 1:
                bfs(fx, x - cb[x][y], y, step);
                break;
            case 2:
                bfs(fx, x, y + cb[x][y], step);
                break;
            case 3:
                bfs(fx, x,y - cb[x][y], step);
                break;
        }
        return;
    }
    
    if (cb[x][y] == 0) {
        cb[x][y]=step;
        for (int i = 0; i<4; i++) {
            bfs(i,x+dx[i], y+dy[i], step + 1);
        }
        return;
    }
    if (cb[x][y]>step) {
        cb[x][y] = step;
        for (int i = 0; i<4; i++) {
            bfs(i,x+dx[i], y+dy[i], step + 1);
        }
        return;
    }
  
    
}
int main()
{
    int k,x,y,p,x1,y1,x2,y2;
    
    while (scanf("%d%d", &n, &m) != EOF) {
        memset(cb, 0, sizeof(cb));
        scanf("%d", &k);
        for (int i = 0; i < k; i++) {
            scanf("%d%d%d", &x, &y, &p);
            cb[x][y] = 0 - p;
        }
        scanf("%d%d", &x1, &y1);
        cb[x1][y1] = -1;
        
        scanf("%d%d", &x2, &y2);
        for (int i=0; i<4; i++) {
            bfs(i, x1+dx[i], y1+dy[i], 1);
        }
        if (cb[x2][y2]!=0) {
            printf("%d\n",cb[x2][y2]);
        }
        else {
            printf("impossible\n");
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • sì 支zhī茶chá 对duì 酒jiǔ,赋fù 对duì 诗shī,燕yàn子zi 对duì 莺yīng 儿é...
    每个人的孟母堂阅读 5,045评论 0 6
  • 大年初一拜年忙, 亲情浓意礼满厢。 姑舅迎门开口笑, 叔姨把手唠家常。 八仙神侃盘腿炕, 金蛇狂舞旋风墙。 兴高老...
    飞镝阅读 1,391评论 0 0
  • 沉寂几个月,家里面终于又响起了钢琴的弹奏声。这不,随着寒假的来临,家里的大学生也终于放假回来了。平日里闲置的钢琴,...
    清水无香LY阅读 4,415评论 13 10
  • 溪水去处潺潺声, 似是无形引路出; 遥思浮云九万里, 还需大鹏展翅起。
    大圣书斋阅读 1,514评论 0 1