美文网首页
[算法设计与分析]Bao 解题报告

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

作者: vouv | 来源:发表于2018-06-17 17:09 被阅读0次

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");
        }
    }
}

相关文章

网友评论

      本文标题:[算法设计与分析]Bao 解题报告

      本文链接:https://www.haomeiwen.com/subject/ezvweftx.html