Untitled
unknown
plain_text
3 years ago
1.7 kB
6
Indexable
# include<stdio.h> # include <limits.h> # include <math.h> int N,S,T; int h[15+1]; int jumped[15+1]; // 記錄石頭是否被跳過 int color[15+1]; // 記錄石頭顏色 int route[15]; // 記錄跳的路徑 int max_e = INT_MIN; int max_j = INT_MIN; void jump(int cur, int end, int step); int cost(int jumps); void jump(int cur, int end, int step){ int i; for(i=1;i<=N;i++){ // for i in 全部石頭 if(color[i]==color[cur] || i==cur-1 || i==cur+1){ //若顏色相同 or 為當前石頭的前後一個石頭 if(jumped[i]==1 && i!=cur){ // 且並非已跳過的石頭 or 不是自己 route[step] = i; // 記錄跳到的石頭編號 jumped[cur] = 0; // 跳之前的石頭變為 0 jump(i, end, step+1); // 進行下一次跳躍 } } } if(cur>=end){ if(cur==end){ int cur_e = 0; cur_e = cost(step-1); if(cur_e>max_e){ max_e = cur_e; max_j = step-1; } else if(cur_e=max_e && step-1>max_j){ max_j = step-1; } } return; } } int cost(int jumps){ int i; int total_e = 0; for(i=0;i<jumps;i++){ total_e += abs(route[i]-route[i+1])*abs(h[route[i]]- h[route[i+1]]); } return total_e; } int main(void){ int i; scanf("%d%d%d", &N, &S, &T); route[0] = S; for(i=1;i<=N;i++) scanf("%d", &h[i]); for(i=1;i<=N;i++) scanf("%d", &color[i]); for(i=1;i<=N;i++) jumped[i] = 1; jump(S, T, 1); printf("%d %d\n", max_e, max_j); return 0; }
Editor is loading...