美文网首页
[算法设计与分析]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