bzoj1616[Usaco2008 Mar]Cow Travelling游荡的奶牛*

bzoj1616[Usaco2008 Mar]Cow Travelling游荡的奶牛

题意:

n行m列的草地上有一些位置有障碍物。第0时刻奶牛在(r1,c1),第t时刻奶牛在(r2,c2)(注意这里都是行在前,列在后),求奶牛走的方案数。n,m≤100,t≤15。

题解:

dp。f[i][j][k]表示当前为第i时刻,在j行k列,则f[i][j][k]=f[i+1][j-1][k]+f[i+1][j+1][k]+f[i+1][j][k-1]+f[i+1][j][k+1],前提是这些位置不出边界且不为障碍物。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define maxn 110
 5 #define inc(i,j,k) for(int i=j;i<=k;i++)
 6 #define dec(i,j,k) for(int i=j;i>=k;i--)
 7 using namespace std;
 8 
 9 int n,m,t,x[maxn][maxn],y[maxn][maxn],x1,y1,x2,y2; char map[maxn][maxn];
10 int main(){
11     scanf("%d%d%d",&n,&m,&t); inc(i,1,n)scanf("%s",map[i]+1); scanf("%d%d%d%d",&x1,&y1,&x2,&y2); x[x2][y2]=1;
12     dec(i,t,1){
13         memset(y,0,sizeof(y));
14         inc(j,1,n)inc(k,1,m){
15             if(j+1<=n&&map[j+1][k]!='*')y[j][k]+=x[j+1][k];
16             if(j-1>=1&&map[j-1][k]!='*')y[j][k]+=x[j-1][k];
17             if(k+1<=m&&map[j][k+1]!='*')y[j][k]+=x[j][k+1];
18             if(k-1>=1&&map[j][k-1]!='*')y[j][k]+=x[j][k-1];
19         }
20         swap(x,y);
21     }
22     printf("%d",x[x1][y1]); return 0;
23 }

 

20160802

posted @ 2016-08-03 13:24  YuanZiming  阅读(149)  评论(0编辑  收藏  举报