経路問題
今日のお題
座標1~8の8x8マスのチェス盤の上の座標が"(x y)(a b)"の形式で2つ与えられる。a > x, b > yは常に満たされる。(x y)から(a b)へ至る経路数を求めよ。
回答
import java.util.*; import java.io.*; class Main { public static String ChessboardTraveling(String str) { int x = str.charAt(1); int y = str.charAt(3); int a = str.charAt(6); int b = str.charAt(8); int len = (a - x) + (b - y); int right = a - x; int paths = 1; for (int i = len; len - right < i; i--) { paths *= i; } for (int i = 1; i <= right; i++) { paths /= i; } return Integer.toString(paths); } //mainやmainから呼ばれるメソッドのシグネチャはcoderbyteのお作法 public static void main(String[] args) { // keep this function call here Scanner s = new Scanner(System.in); System.out.print(ChessboardTraveling(s.nextLine())); } }
感想
小学校からお馴染みの経路問題。ここはcoderbyteなので座標は1から始まる。条件が厳しいのでparseも文字位置指定で十分。プログラムになれている人は再帰で書くのだろう。Eight queensを思い出す。
これがHardレベルというのはどうかと思うが、Easyとくらべると回答者の数がぐっと減り、テストケースで満点を取れていないようなコードが回答例に出てきたりする。これで金を取るのか。
今晩残りの時間はpermutationの計算について少し考えるのと、Java Collections Frameworkの勉強に費やす。