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