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; }
奶 牛们在被划分成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)的奶牛可能经过的路径有哪些。
* 第1行: 3个用空格隔开的整数:N,M,T
* 第2..N+1行: 第i+1行为M个连续的字符,描述了草地第i行各点的情况,保证 字符是'.'和'*'中的一个 * 第N+2行: 4个用空格隔开的整数:R1,C1,R2,以及C2
* 第1行: 输出S,含义如题中所述