【BZOJ】1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛(dp/-bfs)

http://www.lydsy.com/JudgeOnline/problem.php?id=1616

我觉得bfs是可过的,但是交bfs上去是wa?

然后没办法看dp,原来这bfs能和dp联系在一起。。

很简单

f[i][x][y]表示i秒到(x, y)的方案数,那么累计四周的方案数即可

#include <cstdio>

#include <cstring>

#include <cmath>

#include <string>

#include <iostream>

#include <algorithm>

using namespace std;

#define rep(i, n) for(int i=0; i<(n); ++i)

#define for1(i,a,n) for(int i=(a);i<=(n);++i)

#define for2(i,a,n) for(int i=(a);i<(n);++i)

#define for3(i,a,n) for(int i=(a);i>=(n);--i)

#define for4(i,a,n) for(int i=(a);i>(n);--i)

#define CC(i,a) memset(i,a,sizeof(i))

#define read(a) a=getint()

#define print(a) printf("%d", a)

#define dbg(x) cout << #x << " = " << x << endl

#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }

inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }

inline const int max(const int &a, const int &b) { return a>b?a:b; }

inline const int min(const int &a, const int &b) { return a<b?a:b; }



const int N=105, fx[]={-1, 1, 0, 0}, fy[]={0, 0, -1, 1};

int mp[N][N], n, m, T, R, C, X, Y, f[20][N][N];

int main() {

	read(n); read(m); read(T);

	int dx, dy;

	char st[105];

	for1(i, 1, n) {

		scanf("%s", st);

		for1(j, 1, m) if(st[j-1]!='.') mp[i][j]=1;

	}

	read(X); read(Y); read(R); read(C);

	f[0][X][Y]=1;

	for1(i, 1, T) for1(j, 1, N) for1(k, 1, N) if(!mp[j][k]) rep(l, 4) {

		dx=fx[l]+j; dy=fy[l]+k;

		if(dx<1 || dy<1 || dx>n || dy>m || mp[dx][dy]) continue;

		f[i][j][k]+=f[i-1][dx][dy];

	}

	print(f[T][R][C]);

	return 0;

}

 

 


 

 

Description

奶 牛们在被划分成N行M列(2 <= N <= 100; 2 <= M <= 100)的草地上游走,试图找到整块草地中最美味的牧草。Farmer John在某个时刻看见贝茜在位置 (R1, C1),恰好T (0 < T <= 15)秒后,FJ又在位置(R2, C2)与贝茜撞了正着。 FJ并不知道在这T秒内贝茜是否曾经到过(R2, C2),他能确定的只是,现在贝茜在那里。 设S为奶牛在T秒内从(R1, C1)走到(R2, C2)所能选择的路径总数,FJ希望有一个程序来帮他计算这个值。每一秒内,奶牛会水平或垂直地移动1单位距离(奶牛总是在移动,不会在某秒内停在它上一 秒所在的点)。草地上的某些地方有树,自然,奶牛不能走到树所在的位置,也不会走出草地。 现在你拿到了一张整块草地的地形图,其中'.'表示平坦的草地,'*'表示挡路的树。你的任务是计算出,一头在T秒内从(R1, C1)移动到(R2, C2)的奶牛可能经过的路径有哪些。

Input

* 第1行: 3个用空格隔开的整数:N,M,T

* 第2..N+1行: 第i+1行为M个连续的字符,描述了草地第i行各点的情况,保证 字符是'.'和'*'中的一个 * 第N+2行: 4个用空格隔开的整数:R1,C1,R2,以及C2

Output

* 第1行: 输出S,含义如题中所述

Sample Input

4 5 6
...*.
...*.
.....
.....
1 3 1 5

输入说明:

草地被划分成4行5列,奶牛在6秒内从第1行第3列走到了第1行第5列。

Sample Output

1

奶牛在6秒内从(1,3)走到(1,5)的方法只有一种(绕过她面前的树)。

HINT

Source

Silver

你可能感兴趣的:(USACO)