这是一道找所有可以通过的路的数量的一道题,给我们一个矩阵,只有1和0,其中1代表阻碍,0代表通路,我们只能向右或者向上走,要我们求从左下角到右上角的所有路得数量。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#define M 3010
#define N 3010
#define mo 2333
using namespace std;
int a[M][N];//存图
int b[M][N];//各点的到左下角的路的数量
template<class T>inline void read(T &res)
{
char c;T flag=1;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}//快读模板
void printa(int m,int n)
{
for(int i=1; i<=m; i++)
for(int j=1; j<=n; j++)
{
read(a[i][j]);
}
}//将图用矩阵储存起来
int main()
{
int m,n;
memset(b,0,sizeof(b));
read(m);
read(n);
printa(m,n);
for(int i=m; i>=1; i--)
{
if(a[i][1]!=1)
b[i][1]=1;
else
break;
}
for(int i=2; i<=n; i++)
{
if(a[m][i]!=1)
b[m][i]=1;
else
break;
}//先将图的左边和下边赋值,需要注意到我们只能从左下角为起点赋值,若为出现障碍则路数都为1,否则出现障碍后的各点都为0
for(int i=2; i<=n; i++)
for(int j=m-1; j>=1; j--)
{
if(a[j][i]!=1)
b[j][i]=(b[j+1][i]+b[j][i-1])%mo;//其余各点我们可以从下至上从左至右依次根据公式进行填充
}
printf("%d\n",b[1][n]%mo);
return 0;
}