Escape Problem

题目描述

Hamilton, the famous thief, plans a bank robbery in L.A. When searching for the escape route, he takes two main factors into consideration. First, he cannot pass through any intersection twice since the police will set up force at any intersection after he passes it for the first time. Second, as, in America, vehicles are driven on the right side, it is too risk for Hamilton to take a left turn at intersections when escaping. So he will always drive straight ahead or turn right when he comes to a intersection.

Hamilton is planning his escape route. He pays you, his partner, to calculate the number of different ways which leads him to his shelter. He gives you the map of the city, which looks like grids, with only streets leading in East-West direction and South-North direction. His starting position is (0, 0) which is the South-West corner of the city and his shelter is located at (x, y) which stands for the intersection of the (x+1)th South-North direction street and the (y+1)th East-Wesst direction street. Moreover, when he starts at (0, 0), he is heading north, and of course, he can make a right turn there as well.

As the total number of different ways might be very large, you are asked to give the number's residue modulo 100000007.

输入

The first line of input contains N (N <=100), the number of test cases. Each of the following lines describes one test case. Each line consists of four integers, X, Y, x, y(0<X,Y≤2000, 0≤x≤X, 0≤y≤Y), which (X, Y) is the North-East corner of the city and (x, y) is the location of Hamilton's shelter. The famous thief, of course, cannot driver out of the city.

输出

For each test case, print one line with a single integer which is the corresponding answer.

样例输入
3
3 4 0 0
3 4 1 0
3 4 1 1
样例输出
1
13
16


The following is my answer
这是一个递归的问题, 计算的时候每次对 (x + 1, y) , (x + 2, y) .... (X, y)  为参考原点 (0,0) 生成新的坐标系作递归计算。

/* ============================================================================ Name : Escape.c Author : Li.Yong Version : Copyright : Your copyright notice Description : Escape problem in C, Ansi-style ============================================================================ */ #include <stdio.h> #include <stdlib.h> /* Input 3 3 4 0 0 3 4 1 0 3 4 1 1 */ /* Output 1 13 16 */ int calc(int X, int Y, int x, int y) { int i, count; if(0 == x && 0 == y) return 1; count = Y - y + 1; for(i = x + 1 ; i <= X; i++) count += (Y - y) * calc(x, y, i - x, 0); return count; } int main(void) { int caseNumber = 0; scanf("%d/n", &caseNumber); if( caseNumber <= 0) return -1; int (*array)[4] = (int (*)[4]) malloc( caseNumber * caseNumber * sizeof(int)); int j = 0; for(j = 0; j < caseNumber ; j++) scanf("%d %d %d %d", &array[j][0],&array[j][1],&array[j][2],&array[j][3]); for(j = 0; j < caseNumber ; j++) printf("%d/n",calc(array[j][0],array[j][1],array[j][2],array[j][3])); return 0; }


你可能感兴趣的:(Escape Problem)