题目描述:
金木研是舌尖上的东京的主持人~他现在十分饥饿
现有一张n*m的网状地图,金木研在地图的左上角,食物在地图的右下角。
金木研现在十分饥饿,以至于丧失意识,因此只能向下或者向右移动(更接近“食物”),但是途中也有很多白鸽(搜查官),研要避开那些搜查官,现在给出各搜查官的位置和地图的大小,我们要求得到达”食物”的方法有多少种。若无法到达目的地则输出”oh no!”(都为小写)
数据范围 0<n,m<5000
结果可能过大,请输出对 99,999,997 取模的结果
输入:
第一行一个整数,表示当前测试数据组数
第二行包括三个数字 n m l分别表示网状地图的行数与列数和搜查官的个数
接下来l行,每行包含两个数字xi,yi分别表示这个搜查官所在的行数和列数(也可以把(xi,yi)看成坐标)
输出:
对于每个测试案例首先输出 ”Case #Ti:“ Ti代表第i组测试数据
接下来,包括一个数字或者“oh no!”,分别表示到达“食物”的食物路线个数或者无法到达。
样例输入:
1
10 10 2
1 10
4 4
2
20 20 5
4 19
8 15
18 12
3 4
2 12
3
4 4 2
4 3
3 4
样例输出:
Case #1
30139
Case #2
69765970
Case #3
oh no!
代码:
#include <iostream>
using namespace std;
int map[5001][5001]={0};
int main()
{
int t,tt;
int k,j,n,m,l,x,y;
cin>>t;
while(t--)
{
cin>>tt;
cin>>n>>m;
cin>>l;
for (k=0;k<l;k++)
{
cin>>x>>y;
map[x][y]=-1;
}
map[1][1]=1;
for (k=1;k<=n;k++)
for (j=1;j<=m;j++)
if ((k!=1)||(j!=1))
{
if (map[k][j]!=-1)
{
map[1][1]=1;
map[k][j]=map[k-1][j]+map[k][j-1];
map[k][j]%=99999997;
}
else
map[k][j]=0;
}
cout<<"Case #"<<tt<<":"<<endl;
if (map[n][m]==0)
cout<<"oh no!"<<endl;
else
cout<<map[n][m]<<endl;
}
return 0;
}