andre_joy

导航

hdu 1208

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1208

题意:走迷宫,每个格子里面数字代表与下一个格子间隔是几,求有多少种走法到n。

mark:记忆化搜索。本来觉得直接暴力搜索可过,结果tle了。dp[i][j]存放该格子有多少总走法。

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int n;
char a[40][40];
int s[40][40];
long long dp[40][40];
int tab[2][2] = {1, 0, 0, 1};

long long 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+tab[i][0]*s[x][y];
        yy = y+tab[i][1]*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(scanf("%d", &n), n > 0)
    {
        for(int i = 0; i < n; i++)
            scanf("%s", 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;
        printf("%I64d\n", dfs(0, 0));
    }
    return 0;
}

posted on 2012-08-19 20:06  andre_joy  阅读(238)  评论(0编辑  收藏  举报