标签:
给定一个n*m的网格,左上角(1, 1),右下角(n, m)。
小w在(i, j),他会从"上左下右"四个方向中选定两个不同但正交的方向,然后他只能沿着这两个方向走,直到他走出网格。
小w想知道有多少种不同的走法。
两个走法不同当且仅当所经过的格子的集合不同。
输入包含多组数据。
每组数据一行四个整数n, m, i, j。(1 <= i <= n <= 100, 1 <= j <= m <= 100)
对于每组数据,输出一个整数表示方案数,答案对1000000007取模。
无论怎么走,要么覆盖一格,要么覆盖两格。
2 1 1 1
2
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int MOD = 1000000007; LL dp[210][210]; LL Search(int x1, int y1, int x2, int y2) { return dp[abs(x1 - x2) + abs(y1 - y2)][abs(x1 - x2)]; } int main() { for(int i = 0; i <= 205; ++i) { dp[i][0] = 1; dp[i][1] = i; } for(int i = 1; i <= 205; ++i) { for(int j = 2; j <= i; ++j) { dp[i][j] = dp[i-1][j-1] + dp[i-1][j]; dp[i][j] %= MOD; } } int n, m, x, y; LL ans; while(scanf("%d %d %d %d", &n, &m, &x, &y) != EOF) { ans = 0; if(n == 1 || m == 1) { ans = n + m - 1; } else { for(int i = 1; i <= m; ++i) { ans += Search(1, i, x, y); ans += Search(n, i, x, y); } for(int i = 2; i < n; ++i) { ans += Search(i, 1, x, y); ans += Search(i, m, x, y); } } ans %= MOD; cout << ans << endl; } }
标签:
原文地址:http://www.cnblogs.com/ya-cpp/p/4680925.html