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