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

Problem

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

输入:第一行有两个整数,n和m(3=

注意:输入有多组用例。

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
#include
#include 
#include

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 解题报告)