记忆化搜索游荡的奶牛

wxjor wxjor     2022-09-03     752

关键词:

[luogu1535]游荡的奶牛

题目描述

Searching for the very best grass, the cows are travelling about the pasture which is represented as a grid with N rows and M columns (2 <= N <= 100; 2 <= M <= 100). Keen observer Farmer John has recorded Bessie‘s position as (R1, C1) at a certain time and then as (R2, C2) exactly T (0 < T <= 15) seconds later. He‘s not sure if she passed through (R2, C2) before T seconds, but he knows she is there at time T.

FJ wants a program that uses this information to calculate an integer S that is the number of ways a cow can go from (R1, C1) to (R2, C2) exactly in T seconds. Every second, a cow can travel from any position to a vertically or horizontally neighboring position in the pasture each second (no resting for the cows). Of course, the pasture has trees through which no cow can travel.

Given a map with ‘.‘s for open pasture space and ‘*‘ for trees, calculate the number of possible ways to travel from (R1, C1) to (R2, C2) in T seconds.

奶牛们在被划分成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,含义如题中所述。

 

输入输出样例

输入样例#1:
4 5 6
...*.
...*.
.....
.....
1 3 1 5
输出样例#1:
1

说明

样例说明:

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

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

 

 

我一开始剪枝DFS T了一个点,后来用剪枝+DFS+记忆化把那个点给A了,结果T了另外一个点……

改成纯记忆化才A掉……RP low

 

代码(没有一点技术含量TAT)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
//#include<cmath>

using namespace std;
const int INF = 9999999;
#define LL long long

inline int read(){
	int x=0,f=1;char c=getchar();
	for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
	for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
	return x*f;
}
int N,M,T;
bool Map[101][101];
int f[101][101][17];
char c;
int R1,R2,C1,C2;
int ans;
bool vis[101][101][17];
int dfs(int a,int b,int ex,int ey,int t){
    if(t+abs(ex-a)+abs(ey-b)>T) return f[a][b][t]=0;
	if(vis[a][b][t]) return f[a][b][t];
	vis[a][b][t]=true;
	if(a==ex&&b==ey&&t==T){
		f[a][b][t]=1;
		return 1;
	}
	if(Map[a+1][b]&&a+1<=N) f[a][b][t]+=dfs(a+1,b,ex,ey,t+1);
	if(Map[a-1][b]&&a-1>=1) f[a][b][t]+=dfs(a-1,b,ex,ey,t+1);
	if(Map[a][b+1]&&b+1<=M) f[a][b][t]+=dfs(a,b+1,ex,ey,t+1);
	if(Map[a][b-1]&&b-1>=1) f[a][b][t]+=dfs(a,b-1,ex,ey,t+1);
	return f[a][b][t];
}
int main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	memset(Map,true,sizeof(Map));
	N=read(),M=read(),T=read();
	for(int i=1;i<=N;i++){
		for(int j=1;j<=M;j++){
			cin>>c;
			if(c==‘*‘) Map[i][j]=false;
		}
	}
	R1=read(),C1=read(),R2=read(),C2=read();
	printf("%d
",dfs(R1,C1,R2,C2,0));
	return 0;
}

bzoj1638[usaco2007mar]cowtraffic奶牛交通:记忆化搜索图中边的经过次数

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1638题意:  给你一个有向图,n个点,m条有向边。  对于所有从入度为0的点到n的路径,找出被经过次数最多的一条边,输出这个次数。 题解:  edge为原边,redge为反向... 查看详情

p2921[usaco08dec]在农场万圣节trickortreatonthefarm记忆化搜索dfs(代码片段)

...i行包含一个整数,表示第i只奶牛要前往的隔间数。 记忆化搜索好题!!!!!! 思路:递归更新dis数组表示距离结束的距离两个记忆化递归 wa了好多小细节#include<bits/stdc++.h>usingnamespacestd;//inputbybxd#definerep(i,a,b)f... 查看详情

洛谷p1535游荡的奶牛(代码片段)

P1535游荡的奶牛题目描述Searchingfortheverybestgrass,thecowsaretravellingaboutthepasturewhichisrepresentedasagridwithNrowsandMcolumns(2<=N<=100;2<=M<=100).KeenobserverFarmerJohnhasrecordedBessie‘spo 查看详情

cogs130.[usacomar08]游荡的奶牛[dp]

130.[USACOMar08]游荡的奶牛★☆  输入文件:ctravel.in  输出文件:ctravel.out   简单对比时间限制:1s  内存限制:128MB奶牛们在被划分成N行M列(2<=N<=100;2<=M<=100)的草地上游走,试图找到整块草... 查看详情

[bzoj]1616:[usaco2008mar]cowtravelling游荡的奶牛

1616:[Usaco2008Mar]CowTravelling游荡的奶牛TimeLimit: 5Sec  MemoryLimit: 64MBSubmit: 1312  Solved: 736[Submit][Status][Discuss]Description奶牛们在被划分成N行M列(2<=N<=100 查看详情

1616:[usaco2008mar]cowtravelling游荡的奶牛

Description奶牛们在被划分成N行M列(2<=N<=100;2<=M<=100)的草地上游走,试图找到整块草地中最美味的牧草。FarmerJohn在某个时刻看见贝茜在位置(R1,C1),恰好T(0<T<=15)秒后,FJ又在位置(R2,C2)与贝茜撞了正着。FJ并不知道在这T... 查看详情

[usaco2008mar]cowtravelling游荡的奶牛(代码片段)

题目描述奶牛们在被划分成N行M列(2<=N<=100;2<=M<=100)的草地上游走,试图找到整块草地中最美味的牧草。FarmerJohn在某个时刻看见贝茜在位置(R1,C1),恰好T(0<T<=15)秒后,FJ又在位置(R2,C2)与贝茜撞了正着。FJ并不知道在这T... 查看详情

bzoj1616[usaco2008mar]cowtravelling游荡的奶牛

Description奶牛们在被划分成N行M列(2<=N<=100;2<=M<=100)的草地上游走,试图找到整块草地中最美味的牧草。FarmerJohn在某个时刻看见贝茜在位置(R1,C1),恰好T(0<T<=15)秒后,FJ又在位置(R2,C2)与贝茜撞了正着。FJ并不知道在这T... 查看详情

bzoj1616[usaco2008mar]cowtravelling游荡的奶牛:dp网格型

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1616题意:  有一个n*m的网格。  ‘.‘表示平坦的草地,‘*‘表示挡路的树(不能走)。  有一只奶牛,第0秒时在(r1,c1),第t秒时在(r1,c2)。  它每一秒钟都会向上下左右... 查看详情

bzoj1589trickortreatonthefarm(tarjan缩点,记忆化搜索)[usaco2008decgold]bzoj计划(代码片段)

整理的算法模板合集:ACM模板点我看算法全家桶系列!!!实际上是一个全新的精炼模板整合计划Weblinkhttps://hydro.ac/d/bzoj/p/1589Problem每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的nnn个牛棚里... 查看详情

bzoj1589trickortreatonthefarm(tarjan缩点,记忆化搜索)[usaco2008decgold]bzoj计划(代码片段)

整理的算法模板合集:ACM模板点我看算法全家桶系列!!!实际上是一个全新的精炼模板整合计划Weblinkhttps://hydro.ac/d/bzoj/p/1589Problem每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的nnn个牛棚里... 查看详情

记忆化搜索(代码片段)

记忆化搜索什么是记忆化搜索?百度百科:算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。个人理解:就是每求到一个状态就保存下来,下次再遇到这个状态直接调用即可它有什么好处... 查看详情

wenbao与记忆化搜索(代码片段)

记忆化搜索:通俗地讲就是搜索的形式,dp的思想 一些搜索难以完成,dp的动态转移方程又不好写的题,就会用到记忆化搜索,利用dp记录路径(相当于为dfs剪枝)用dfs进行模拟。。啦啦啦啦啦啦,,,,,,,,,好厉害!... 查看详情

p2921[usaco08dec]在农场万圣节trickortreatonthefarm(tarjan+记忆化)(代码片段)

P2921[USACO08DEC]在农场万圣节TrickorTreatontheFarm题意翻译题目描述每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节。由于牛棚不太大,FJ通过指... 查看详情

记忆化搜索

记忆化搜素是DP的一种形式记忆化搜素是DP的一种形式 查看详情

hdu1078fatmouseandcheese(记忆化搜索)

...这些点到达当前点所能获得的cheese的最大值。思路:记忆化搜索。假设对于当前的点。没有被搜索过(dp[i][j]=0)。那么就对其进行搜索。搜索过程中 查看详情

hdu2452navymaneuvers记忆化搜索

这题目意思能忍?读了半年,乱七八糟的记忆化搜索拖拖的,dp[i][0]代表以获得最小值为目标的船以i为起点。dp[i][1]代表以获得最大值为目标的船以i为起点。接下来暴力枚举入度为0的点为起点,開始记忆化搜索,constintN=... 查看详情

poj1661helpjimmy(记忆化搜索)

题目链接:http://poj.org/problem?id=1661一道还可以的记忆化搜索题,主要是要想到如何设dp,记忆化搜索是避免递归过程中的重复求值,所以要得到dp必须知道如何递归由于这是个可以左右移动的所以递归过程肯定设计左右所以dp的一... 查看详情