# 12991 - Toad Jumping
>author: Utin
###### tags: `recursion`
---
## Brief
See the code below
## Solution 0
```c=
#include <stdio.h>
int length, s, t;//length: 石頭數量, s: 起點, t: 終點
int stone[1001][3];//[0]: 高度, [1]: 顏色, [2]: 是否踩過
int pass_case[2];//[0]: 耗能, [1]: 步數
int abs(int a);
int energy(int height_i, int height_j, int index_i, int index_j);
void jump(int index, int sum_e, int sum_s);
int main() {
scanf("%d %d %d", &length, &s, &t);
for(int i = 0; i < length; i++) {
scanf("%d", &stone[i][0]);
}
for(int i = 0; i < length; i++) {
scanf("%d", &stone[i][1]);
}
//題目很搞事不把0當第一項
s -= 1;
t -= 1;
jump(s, 0, 0);
printf("%d %d\n", pass_case[0], pass_case[1]);
}
//絕對值
int abs(int a) {
if(a >= 0) return a;
else return -a;
}
//計算消耗的能量
int energy(int height_i, int height_j, int index_i, int index_j) {
return (abs(height_i-height_j) * abs(index_i-index_j));
}
void jump(int index, int sum_e, int sum_s) {
//設成已經踩過
stone[index][2] = 1;
//到終點
if(index == t) {
//取耗能最多的
if(sum_e > pass_case[0]) {
pass_case[0] = sum_e;
pass_case[1] = sum_s;
}
//耗能相同取步數多的
else if(sum_e == pass_case[0] && sum_s > pass_case[1]) {
pass_case[1] = sum_s;
}
}
//還沒到終點
else {
//每一點都試試
for(int i = 0; i < length; i++) {
//不用試自己本身或已踩過的石頭
if(i != index && stone[i][2] != 1) {
//顏色相同或只隔一顆石頭才能跳
if(stone[index][1] == stone[i][1] || i == index-1 || i == index+1) {
//確定下顆石頭能跳要計算能量消耗
int temp = sum_e + energy(stone[index][0], stone[i][0], index, i);
//跳去下一顆石頭
jump(i, temp, sum_s+1);
}
}
}
}
//這行必加,我卡超久,遞迴退出來要還原成沒踩過的狀態
stone[index][2] = 0;
}
// By Utin
```
## Reference