hdu 1208 记忆化搜索

题目大意:只能按照格子上的数字*方向走,从左上走到右下
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("*****\n");

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\n",dfs(0,0));

53     }

54 }

 

你可能感兴趣的:(HDU)