AOJ2186 Heian-Kyo Walking

問題リンク Heian-Kyo Walking

  • 解法

非常に典型的なDPになります。
ホクサイはゴールから遠ざかるような動きをしないので(i, j)の交差点から(i+1, j)か(i, j+1)に進みます。
dp[i][j]: 交差点(i, j)に到達する経路の数
とすることで解けます。

  • ソース
import java.util.Scanner;

//Heian-Kyo Walking
public class AOJ2186 {

	void run(){
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		while(T--!=0){
			int w = sc.nextInt(), h = sc.nextInt(), n = sc.nextInt();
			int[][] dp = new int[h+1][w+1];
			boolean[][][][] e = new boolean[h+1][w+1][h+1][w+1];
			while(n--!=0){
				int x1 = sc.nextInt(), y1 = sc.nextInt(), x2 = sc.nextInt(), y2 = sc.nextInt();
				e[y1][x1][y2][x2] = e[y2][x2][y1][x1] = true;
			}
			dp[0][0] = 1;
			for(int j=1;j<=w;j++)dp[0][j] = e[0][j-1][0][j]?0:dp[0][j-1];
			for(int i=1;i<=h;i++)dp[i][0] = e[i][0][i-1][0]?0:dp[i-1][0];
			for(int i=1;i<=h;i++)for(int j=1;j<=w;j++)dp[i][j] = (e[i][j][i][j-1]?0:dp[i][j-1])+(e[i][j][i-1][j]?0:dp[i-1][j]);
			System.out.println(dp[h][w]==0?"Miserable Hokusai!":dp[h][w]);
		}
	}
	
	public static void main(String[] args) {
		new AOJ2186().run();
	}
}