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

一蓑烟雨任生平 一蓑烟雨任生平     2022-10-25     442

关键词:

题目描述

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+剪枝

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 110
using namespace std;
int n,m,s,ans;
int sx,sy,tx,ty;
int map[MAXN][MAXN];
int dx[4]=1,-1,0,0;
int dy[4]=0,0,1,-1;
void dfs(int x,int y,int tot)
    if(tot>s)    return ;
    if(x<1||x>n||y<1||y>m||map[x][y])    return ;
    if(abs(x-tx)+abs(y-ty)>s-tot)    return ;
    if(x==tx&&y==ty&&s==tot)
        ans++;
        return ;
    
    dfs(x+1,y,tot+1);
    dfs(x-1,y,tot+1);
    dfs(x,y+1,tot+1);
    dfs(x,y-1,tot+1);

int main()
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            char s;cin>>s;
            if(s==.)    map[i][j]=0;
            else  map[i][j]=1; 
        
    scanf("%d%d%d%d",&sx,&sy,&tx,&ty);
    dfs(sx,sy,0);
    cout<<ans; 

思路:记忆化搜索。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 110
using namespace std;
int n,m,s,ans;
int sx,sy,tx,ty;
int map[MAXN][MAXN],f[MAXN][MAXN][20];
int dx[4]=1,-1,0,0;
int dy[4]=0,0,1,-1;
void dfs(int x,int y,int tot)
    if(f[x][y][tot])    return ;
    if(tot>s)    return ;
    if(abs(x-tx)+abs(y-ty)>s-tot)    return ;
    if(x==tx&&y==ty&&tot==s)
        f[x][y][tot]=1;
        return ;
    
    for(int i=0;i<4;i++)
        int cx=x+dx[i];
        int cy=y+dy[i];
        if(cx>=1&&cx<=n&&cy>=1&&cy<=m&&!map[cx][cy])
            dfs(cx,cy,tot+1);
        f[x][y][tot]+=f[cx][cy][tot+1];
    

int main()
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            char s;cin>>s;
            if(s==.)    map[i][j]=0;
            else  map[i][j]=1; 
        
    scanf("%d%d%d%d",&sx,&sy,&tx,&ty);
    dfs(sx,sy,0);
    cout<<f[sx][sy][0]; 

 

洛谷1578:[wc2002]奶牛浴场——题解(代码片段)

https://www.luogu.org/problemnew/show/P1578#sub由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少。为了讨好奶牛,John决定在牛场中建造一个大型浴场。但是John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个... 查看详情

记忆化搜索游荡的奶牛

[luogu1535]游荡的奶牛题目描述Searchingfortheverybestgrass,thecowsaretravellingaboutthepasturewhichisrepresentedasagridwithNrowsandMcolumns(2<=N<=100;2<=M<=100).KeenobserverFarmerJohnhasrecordedBess 查看详情

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 查看详情

bzoj1827洛谷2986[usaco10mar]伟大的奶牛聚集greatcowgather(代码片段)

【题解】  很容易想到暴力做法,枚举每个点,然后对于每个点O(N)遍历整棵树计算答案。这样整个效率是O(N^2)的,显然不行。  我们考虑如果已知当前某个点的答案,如何快速计算它的儿子的答案。  显然选择它的儿子... 查看详情

洛谷p1824进击的奶牛二分答案(求最大的最小值)(代码片段)

题目链接:https://www.luogu.org/problemnew/show/P1824题目描述FarmerJohn建造了一个有N(2<=N<=100,000)个隔间的牛棚,这些隔间分布在一条直线上,坐标是x1,...,xN(0<=xi<=1,000,000,000)。他的C(2<=C<=N)头牛不满于隔间的位置分布,它们为... 查看详情

洛谷p2733家的范围homeontherange(代码片段)

 P2733家的范围HomeontheRange题目背景农民约翰在一片边长是N(2<=N<=250)英里的正方形牧场上放牧他的奶牛。(因为一些原因,他的奶牛只在正方形的牧场上吃草。)遗憾的是,他的奶牛已经毁坏一些土地。(一些1平方英里的正方形... 查看详情

洛谷p2915[usaco08nov]奶牛混合起来mixedupcows(代码片段)

P2915[USACO08NOV]奶牛混合起来MixedUpCows题目描述EachofFarmerJohn‘sN(4<=N<=16)cowshasauniqueserialnumberS_i(1<=S_i<=25,000).Thecowsaresoproudofitthateachonenowwearshernumberinagangstamannerengravedin 查看详情

1616:[usaco2008mar]cowtravelling游荡的奶牛

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

p1535(代码片段)

P1535P1535记忆化搜索(dp[i][j][t])表示从(i,j)开始走还剩下(t)秒时方案数那么开始时就是(dfs(stx,sty,t))到达(edx,edy,0)时算一种路线那么整个的结构就很清晰了:if(judge(x+1,y))ans+=dfs(x+1,y,t-1);if(judge(x-1,y))ans+=dfs(x-1,y,t-1);if(judge(x,y+ 查看详情

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)。  它每一秒钟都会向上下左右... 查看详情

洛谷p1879解题报告(代码片段)

P1879[USACO06NOV]玉米田CornFields题目描述农场主\(John\)新买了一块长方形的新牧场,这块牧场被划分成\(M\)行\(N\)列\((1≤M≤12;1≤N≤12)\),每一格都是一块正方形的土地。\(John\)打算在牧场上的某几格里种上美味的草,供他的奶牛们享... 查看详情

洛谷p2676超级书架题解(代码片段)

题目传送门题目一看就是贪心。C++福利来了:sort。基本思路就是:要使奶牛最少那么肯定高的奶牛先啦。直接排序一遍(从高到矮)然后while,搞定!#include<bits/stdc++.h>#definelllonglongusingnamespacestd;llN,B,H[20010];boolcmp(intx,inty)retur... 查看详情

洛谷p1578奶牛浴场

P1578奶牛浴场题目描述由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少。为了讨好奶牛,John决定在牛场中建造一个大型浴场。但是John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个固定的位置产... 查看详情

洛谷p2345奶牛集会

题目背景MooFest,2004Open题目描述约翰的N头奶牛每年都会参加“哞哞大会”。哞哞大会是奶牛界的盛事。集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等。它们参加活动时会聚在一起,第i头奶牛的坐标为Xi,没有两头... 查看详情

洛谷p2345奶牛集会

题目背景MooFest,2004Open题目描述约翰的N头奶牛每年都会参加“哞哞大会”。哞哞大会是奶牛界的盛事。集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等。它们参加活动时会聚在一起,第i头奶牛的坐标为Xi,没有两头... 查看详情

洛谷p2345奶牛集会

题目背景MooFest,2004Open题目描述约翰的N头奶牛每年都会参加“哞哞大会”。哞哞大会是奶牛界的盛事。集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等。它们参加活动时会聚在一起,第i头奶牛的坐标为Xi,没... 查看详情