zzulioj1894 985的方格难题(递推)

来源:互联网 发布:优步打车软件 编辑:程序博客网 时间:2024/05/29 19:26
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
2
2 1 2
2 2 2
Sample Output
1

-1

思路:第一格标记为1,横竖递推,坏掉的格子pass掉,直到推到最后一格。

代码:

#include<stdio.h>  #include<iostream>  #include<algorithm>  #include<string.h>  #include<math.h>  using namespace std; int ma=1e9+7;   int main()  {      int t;     scanf("%d",&t);     while(t--)     {         int a[50][50];         memset(a,0,sizeof(a));         int n,q,w;         scanf("%d%d%d",&n,&q,&w);         if(q==n&&w==n||q==1&&w==1)         printf("-1\n");         else        {         a[1][1]=1;         a[q][w]=0;         for(int i=1;i<=n;i++)         for(int j=i;j<=n;j++)         {             if(i==j)             {             a[i][j]=(a[i][j]+a[i][j-1]+a[i-1][j])%ma;             }             else            {             a[i][j]=(a[i][j]+a[i][j-1]+a[i-1][j])%ma;             a[j][i]=(a[j][i]+a[j-1][i]+a[j][i-1])%ma;                }             a[q][w]=0;         }         printf("%d\n",a[n][n]);          }     }     return 0;  }  


0 0
原创粉丝点击