高仿过河卒,可以去做一做
方法是一样的,小学数学
规定方向只有两个,且是相邻的方向(上+左之类)
到一个点的方案数,是它旁边两个点的方案数之和
比如
1 | 1 |
---|---|
1 | 2 |
注意这个2,由左边的1和右边的1相加得到
而至于题目中的无法到达的点,则应是0
#include<iostream>
using namespace std;
int m,n;
int a[1007][1007];//存方案
bool jud[1007][1007];//存是否可以走
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
jud[i][j]=1;//先假设全都可以走
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
jud[x][y]=0;//有些不能走
}
a[1][1]=1;//第一个点记得赋初值,切记!!!
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==1&&j==1)continue;//不然初值被改掉了,全是0(不要问我怎么知道的)
else a[i][j]=(a[i-1][j]*jud[i-1][j]+a[i][j-1]*jud[i][j-1])%100003;
//借用jud,1是可以到,0是不可以到,很方便
//可以边做边余,防止爆炸,最后答案是一样的,可自行查阅资料
cout<<a[n][n]<<endl;/输出
return 0;
}