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; }