题目大意:只能按照格子上的数字*方向走,从左上走到右下
Sample Input
4
2331
1213
1231
3110
Sample Output
3
直接记忆化搜索,注意是0的情况
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 #define cl(a) memset(a,0,sizeof(a)) 13 #define ts printf("***** "); 14 const int MAXN=1005; 15 int n,m,tt; 16 long long dp[40][40]; 17 char s[40][40]; 18 int a[40][40]; 19 int d[2][2]={1,0,0,1}; 20 long long dfs(int x,int y) 21 { 22 if(dp[x][y]||!a[x][y]) return dp[x][y]; 23 for(int i=0;i<2;i++) 24 { 25 int nx=x+d[i][0]*a[x][y]; 26 int ny=y+d[i][1]*a[x][y]; 27 if(nx>=0&&nx<n&&ny>=0&&ny<n) 28 { 29 dp[x][y]+=dfs(nx,ny); 30 } 31 } 32 return dp[x][y]; 33 } 34 int main() 35 { 36 int i,j,k; 37 #ifndef ONLINE_JUDGE 38 freopen("1.in","r",stdin); 39 #endif 40 while(scanf("%d",&n)!=EOF&&n>0) 41 { 42 for(i=0;i<n;i++) 43 { 44 scanf("%s",s[i]); 45 for(j=0;j<n;j++) 46 { 47 a[i][j]=s[i][j]-'0'; 48 } 49 } 50 memset(dp,0,sizeof(dp)); 51 dp[n-1][n-1]=1; 52 printf("%I64d ",dfs(0,0)); 53 } 54 }