Problem:
鉄道路線II

わたしの住む街には、図のような N 個の駅からなる円環状の鉄道路線があります。この路線の各駅には 0 から N-1 までの番号が順番に割り当てられていて、隣の駅まで100 円で移動することができます。移動はどちらの方向にでも可能です。

わたしはこの路線上のいくつかの駅で買い物をしたいと思っています。そこで、プログラムを作成して移動費を計算することにしました。ある駅を始点として、買い物をするすべての駅を訪問する最小の費用（円）を求めるプログラムを作成してください。ただし、同じ駅を何度訪問しても良く、どのような順番で駅を訪問しても構いません。

入力

入力は以下の形式で与えられる。

N M p
d1
d2
:
dM

1行目に駅の数 N (2 ≤ N ≤ 100000)、買い物をする駅の数 M (1 ≤ M ≤ 10000 かつ M < N)、出発する駅の番号 p (0 ≤ p ≤ N-1) が与えられる。続く M 行に買い物をする駅の番号 di (0 ≤ di ≤ N-1) が与えられる。ただし、diは全て異なり、p もまたどの di とも異なるものとする。

出力

最小の費用を１行に出力する。

入出力例

入力例１

5 4 0
1
2
3
4

出力例１

400

入力例２

7 2 1
6
2

出力例２

400

Solution in JAVA (judge verdict: Accepted)

import java.util.Arrays;
import java.util.Scanner;
 
 
public class Main {
    static boolean[] isDist;
    static int N;
    static int M;
    static int p;
    public static int INF = 1 << 24;
    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);
        N = stdIn.nextInt();
        M = stdIn.nextInt();
        p = stdIn.nextInt();
        Limit = N*50;
        isDist = new boolean[N];
        for(int i = 0; i < M ;i++) {
            int d = stdIn.nextInt();
            isDist[d] = true;
        }
        boolean[] isDist2 = Arrays.copyOf(isDist,N);
         
        solv(1,p,0,0,false,isDist);
        solv(-1,p,0,0,false,isDist2);
        System.out.println(min);
         
    }
    static int min = 1 << 24; 
    static int Limit;
    public static void solv(int vec, int now, int coun, int cos, boolean alC,boolean[] isDist) {
         
        int nowp = now;
        int cost = cos;
        int count = coun;
        while(true) {
            if(min <= cost)return;
            if(nowp == N) nowp = 0;
            else if(nowp == -1) nowp = N-1;
            if(count == M ) {
                if(min > cost)min = cost;
                return;
            }
            if(isDist[nowp]) {
                 
                isDist[nowp] = false;
                count++;
                if(!alC && cost < Limit) {
                    boolean[] isDist2 = Arrays.copyOf(isDist, N);
                     
                    solv(vec*-1,nowp+vec*-1,count,cost+100,true,isDist2);
                }
            }
            if(count == M ) {
                if(min > cost)min = cost;
                return;
            }
            while(true) {
                if(nowp == N) nowp = 0;
                else if(nowp == -1) nowp = N-1;
                if(!isDist[nowp]) {
                    nowp += vec;
                    cost += 100;
                }
                else {
                    break;
                }
            }
        }
    }
}