首页 > 其他分享 >洛谷题单指南-模拟和高精度-P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two

洛谷题单指南-模拟和高精度-P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two

时间:2024-01-19 12:00:27浏览次数:41  
标签:fy P1518 fx 洛谷题 塔姆沃 cy cx fdir cdir

原题链接:https://www.luogu.com.cn/problem/solution/P1518

题意解读:

此题是一道模拟题,关键要解决几个问题:1、如何转换方向 2、如何在地图中移动 3、如何判断无法抓住牛。

解题思路:

定义char a[10][10]用于存储地图,cx,cy和fx,fy分别代表牛、Farmer所在的位置,cdir、fdir分别代表牛、Farmer运动的方向。

1、如何转换方向

cdir、fdir初始值为0,表示向上移动,1表示向右移动(顺时针旋转90度),2表示向下移动(再顺时针旋转90度),3表示

向左移动(再顺时针旋转90度)。

以牛转换方向为例:当牛无法往前移动时,转换方向的操作为cidr = (cdir + 1) % 4

2、如何在地图中移动

在地图中移动,本质上就是左标的变化,根据当前的方向,决定行、列的变化,可以设定一个坐标变化的表格:

  向上   向右   向下   向左
行坐标变化值 -1 0 1 0
列坐标变化值 0 1 0 -1

代码中,定义两个数组即可:

int dx[4] = {-1, 0, 1, 0}; //不同运动方向的x坐标变化
int dy[4] = {0, 1, 0, -1}; //不同运动方向的y坐标变化

以牛移动为例:当前牛的位置cx,cy,移动方向cdir,将要移动到的位置是cx + dx[cdir],cy + dy[cdir]

3、如何判断无法抓住牛

如果能抓取牛,很容易判断,当牛、Farmer移动位置之后,cx == fx && cy == fy则表示抓住了,那如何判断无法抓住牛呢?有两种方法:

方法一:复杂版。

记录每一次牛、Farmer的状态,也就是6个关键变量的值:cx、cy、fx、fy、cdir、fdir,如果这6个变量的值重复出现,则表示路径陷入的某种循环,

永远不会相遇。可以借助哈希思想,计算100000 * cx + 10000 * cy + 1000 * fx + 100 * fy + cdir * 10 + fdir的值,判断该值是否重复出现过即可。

方法二:简单版。

地图是10 * 10,每次有4个方向可走,牛每次有400种走法,Farmer每次也有400种走法,如果在400 * 400 = 160000次之后还没有相遇,基本可以认为

陷入了某种循环,抓不到了,把次数放大一点到200000,超过200000次还无法相遇,则判定抓不到。

下面实现采用此方法。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 10;

char a[N][N];

int dx[4] = {-1, 0, 1, 0}; //不同运动方向的x坐标变化
int dy[4] = {0, 1, 0, -1}; //不同运动方向的y坐标变化

int main()
{
    int cx, cy, fx, fy;
    int cdir = 0; //牛运动方向,0:上  1:右  2:下  3:左
    int fdir = 0; //Farmer运动方向
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < N; j++)
        {
            cin >> a[i][j];
            if(a[i][j] == 'C') cx = i, cy = j; //记录牛初始位置
            if(a[i][j] == 'F') fx = i, fy = j; //记录Farmer初始位置
        }
    }

    int cnt = 0;
    while(cnt < 200000)
    {
        cnt++;

        //牛能否往前
        if(cx + dx[cdir] >= 0 && cx + dx[cdir] < N && cy + dy[cdir] >= 0 && cy + dy[cdir] < N && a[cx + dx[cdir]][cy + dy[cdir]] != '*')
        {
            a[cx + dx[cdir]][cy + dy[cdir]] = 'C';//牛往前一步
            a[cx][cy] = '.'; //原位置先设为空地
            cx = cx + dx[cdir], cy = cy + dy[cdir]; //更新牛的位置
        }
        else cdir = (cdir + 1) % 4;// 牛不能往前,则变换方向
            
        //Farmer能否往前
        if(fx + dx[fdir] >= 0 && fx + dx[fdir] < N && fy + dy[fdir] >= 0 && fy + dy[fdir] < N && a[fx + dx[fdir]][fy + dy[fdir]] != '*')
        {
            a[fx + dx[fdir]][fy + dy[fdir]] = 'F';//Farmer往前一步
            if(a[fx][fy] != 'C') a[fx][fy] = '.'; //原位置如果没有被牛占据,则设为空地
            fx = fx + dx[fdir], fy = fy + dy[fdir];//更新Farmer的位置
        }
        else fdir = (fdir + 1) % 4;// Farmer不能往前,则变换方向

        if(cx == fx && cy == fy) 
        {
            cout << cnt;
            break;
        }
    }
    if(cnt >= 200000) cout << 0;

    return 0;
}

 

标签:fy,P1518,fx,洛谷题,塔姆沃,cy,cx,fdir,cdir
From: https://www.cnblogs.com/jcwy/p/17974338

相关文章

  • 洛谷题单指南-模拟和高精度-P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
    原题链接:https://www.luogu.com.cn/problem/P1328题意解读:非常简单的一道题,核心考点就是循环数组以及评分规则的构建。评分规则:甲vs乙,1表示甲赢,-1表示甲输,-0表示平转化为数组:intrule[5][5]={0,-1,1,1,-1,1,0,-1,1,-1,-1,1,0,-1,1,-1,......
  • 洛谷题单指南-模拟和高精度-P4924 [1007] 魔法少女小Scarlet
    原题链接:https://www.luogu.com.cn/problem/P4924题意解读:根据题意,通过模拟法,枚举每一个要旋转的矩阵,执行旋转操作即可,关键点在于如何进行矩阵旋转。设定矩阵inta[][],临时矩阵intt[][]用于保存旋转后的矩阵,矩阵长度为len。先考虑要旋转的区域左上角是a[0][0]的情况,区域内每......
  • 洛谷题单指南-模拟和高精度-P1601 A+B Problem
    原题链接:https://www.luogu.com.cn/problem/P1601题意解读:本题是高精度加法的模版题。知识点解析:  高精度加法:  如果一个数大到远超过整形变量的范围时,就不能使用int、long、longlong等变量来存储整数,也不能直接通过变量加法来求和。  因此,需要回到加法计算的本质,从个......
  • 洛谷题单指南-模拟和高精度-P1563 [NOIP2016 提高组] 玩具谜题
    原题链接:https://www.luogu.com.cn/problem/P1563题意解读:本题关键在于根据小人的朝向和寻找的方向来确定数组下标的变化。用数组存储小人,intd[]存朝向,inta[]存名称,朝向和寻找方向有4种组合:朝向(0:向内,1:向外)  寻找方向(0:左,1:右)  数组下标操作00顺时针寻找,下标递减......
  • 洛谷题单指南-模拟和高精度-P1042 [NOIP2003 普及组] 乒乓球
    原题链接:https://www.luogu.com.cn/problem/P1042题意解读:分别针对11分制和21分制,输出每局比分。只需要判断一局的结束条件:得分高者如果达到11或者21,且比分间隔大于等于2分,则表示一局结束,可开始下一局,用模拟法即可解决。100分代码:#include<bits/stdc++.h>usingnamespaces......
  • 洛谷题解 | AT_abc321_c Primes on Interval
    目录题目翻译题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2样例#3样例输入#3样例输出#3题目简化题目思路AC代码题目翻译【题目描述】你决定用素数定理来做一个调查.众所周知,素数又被称为质数,其含义就是除了数字一和本身之外不能......
  • 关于洛谷题解审核
    我想问一下,大家觉得题解的重点是什么?很显然是思路,代码的正确性,次要的才是格式。但是,洛谷对于题解格式的审核是不是有点过于严格了呢?比如说这段话:如果\(n\)为\(0\),那么便是无解。大家能一眼看出,后面多了空格吗?这种题解其实没什么大问题,别人看题解时根本不会在意这些......
  • 洛谷题解 | AT_abc321_c Primes on Interval
    目录题目翻译题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2样例#3样例输入#3样例输出#3题目简化题目思路AC代码题目翻译【题目描述】你决定用素数定理来做一个调查.众所周知,素数又被称为质数,其含义就是除了数字一和本身之外不能......
  • P5836 [USACO19DEC] Milk Visits S - 洛谷题解
     题目链接:[P5836] USACO19DEC] MilkVisitsS-洛谷|计算机科学教育新生态(luogu.com.cn)这道题可以用并查集来解决。题目中每个结点只有两个状态:H和G。那么我们可以推断出,只有当起点和终点间每个结点的状态相同但是起点(或者终点或起点到终点之间的某一点)与所需状态不同......
  • 洛谷题解 | P1046 陶陶摘苹果
    ​目录题目描述输入格式输出格式输入输出样例说明/提示题目思路AC代码题目描述陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现......