题目大意:每一小格代表能向右或者向下走几步,问从左上走到右下总共有多少种走法。
dp[i][j]存放该格子有多少总走法。
#include <iostream>
#include <cstring>
using namespace std;
int n;
char a[40][40];
int s[40][40];
__int64 dp[40][40];
int X[]={1, 0};
int Y[]={0, 1};
__int64 dfs(int x, int y)
{
if(dp[x][y] || !s[x][y])
return dp[x][y];
int xx, yy;
for(int i=0; i<2; i++)
{
xx=x+X[i]*s[x][y];
yy=y+Y[i]*s[x][y];
if(xx>=0 && xx<n && yy>=0 && yy<n)
dp[x][y]+=dfs(xx,yy);
}
return dp[x][y];
}
int main()
{
while(cin>>n && n!=-1)
{
for(int i=0; i<n; i++)
cin>>a[i];
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
s[i][j]=a[i][j]-'0';
memset(dp, 0, sizeof(dp));
dp[n-1][n-1]=1;
cout<<dfs(0,0)<<endl;
}
return 0;
}