Contest - 多校训练(985专场)
Problem C: 985的方格难题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 317 Solved: 58
Submit Status Web Board
Description
985走入了一个n * n的方格地图,他已经知道其中有一个格子是坏的。现在他要从(1, 1)走到(n, n),每次只可以向下或者向右走一步,问他能否到达(n,n)。若不能到达输出-1,反之输出到达(n,n)的方案数。
Input
第一行输入一个整数t,代表有t组测试数据。
每组数据第一行输入三个整数n,x,y,分别代表方格地图的大小以及坏掉格子的位置。
注:1 <= t <= 20,1 <= n <= 30,1 <= x,y <= n。
Output
若可以到达(n,n)则输出方案数对1e9 + 7取余的结果,反之输出-1。
Sample Input
22 1 22 2 2
Sample Output
1-1
HINT
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int M = 1e9 + 7;
int t,n,x,y;
long long a[31][31];
long long sum,ans;
void init()
{
sum = 0;ans = 0;
for(int i=1; i<=30; i++) a[i][1] = 1;
for(int j=1; j<=30; j++) a[1][j] = 1;
for(int i=2; i<=30; i++){
for(int j=2; j<=30; j++)
{
a[i][j] = (a[i-1][j]+a[i][j-1]);
//printf("%lld ",a[i][j]%M);
}
//printf("\n");
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&x,&y);
init();
sum = a[n][n];
ans = a[x][y]*a[n+1-x][n+1-y];
sum = (sum-ans);
if(sum == 0) printf("-1\n");
else printf("%lld\n",sum%M);
}
return 0;
}