P1535 [USACO08MAR]Cow Travelling S
考察:记忆化搜索
思路:
注意f数组不能初始化为0,然后通过0判定是否搜过.因为不一定能到终点.....
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 typedef long long LL; 5 const int N = 110,M = 16; 6 int n,m,T,sx,sy,ex,ey; 7 LL f[N][N][M]; 8 char s[N][N]; 9 int xx[4] = {-1,1,0,0},yy[4] = {0,0,-1,1}; 10 void dfs(int x,int y,int t) 11 { 12 if(f[x][y][t]!=-1) return; 13 f[x][y][t] = 0;//标记搜过的点 14 for(int i=0;i<4;i++) 15 { 16 int dx = x+xx[i],dy = y+yy[i]; 17 if(dx>=1&&dx<=n&&dy>=1&&dy<=m&&s[dx][dy]!='*'&&t+1<=T) 18 { 19 dfs(dx,dy,t+1); 20 f[x][y][t]+=f[dx][dy][t+1]; 21 } 22 } 23 } 24 int main() 25 { 26 scanf("%d%d%d",&n,&m,&T); 27 for(int i=1;i<=n;i++) scanf("%s",s[i]+1); 28 scanf("%d%d%d%d",&sx,&sy,&ex,&ey); 29 memset(f,-1,sizeof f); 30 f[ex][ey][T] = 1; 31 dfs(sx,sy,0); 32 printf("%lld\n",f[sx][sy][0]); 33 return 0; 34 }