Fairy tale(BFS + 大模拟)

097634e9169c6777120550ad61afb6bc-1.jpg 立即下载

一.题目链接:

Fairy tale

二.题目大意:

给你一个N × N 的地图,图上的每个点有四种方向(E W S N),代表着移动方向.

在 t = 0 时,saya 在 (1, 1),treasure 在 (n, n).

在每个单位时间内,分为 3 步.

① saya 先按照地图移动一个单位.

② saya 可以向四个方向移动一个单位,saya 会移动到距离 treasure 最近的位置

     如果四个方向距离都一样,那么 saya 不移动.

     否则,按照 E > W > N > S 移动.

③ treasure 按照地图移动. 

在每个单位时间后,地图会改变.

规则如下:E -> W -> S -> N -> E.

在 x<= 100 步时

如果 saya 能得到 treasure,输出 "Get the treasure! At step x."

如果 saya 陷入循环,输出 "Impossible. At step x."

否则输出 "Not sure."

三.分析:

这题本身不难,主要在于对题意的准确理解 和 细节的处理.

一开始就是因为没理解好题意一直 WA.

比如是 saya 的两步先移动完,treasure 才移动.

还有就是必须是四个方向的距离都相等才不动.

如果有一个方向出界,其他方向都相等,此时还是要按照优先级移动的.

四.代码实现:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-4
#define PI acos(-1.0)
#define ll long long int
using namespace std;

const int M = 35;
const int inf = 0x3f3f3f3f;
int maze[M][M];
int ans1, ans2;
int dir[4][2] = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};///E > W > N > S (y, x)
struct node
{
    int y1, x1;///saya
    int y2, x2;///treasure
}s[110];

bool loop(int step)
{
    for(int i = step % 4; i < step; i += 4)
    {
        if(s[step].x1 == s[i].x1 && s[step].y1 == s[i].y1 && s[step].x2 == s[i].x2 && s[step].y2 == s[i].y2)
            return 1;
    }
    return 0;
}

void Move1(int step, int n)
{
    int yy = s[step + 1].y1 = s[step].y1;
    int xx = s[step + 1].x1 = s[step].x1;
    if((maze[yy][xx] + step) % 4 == 0 && xx + 1 <= n)
        s[step + 1].x1 = xx + 1;
    else if((maze[yy][xx] + step) % 4 == 1 && xx - 1 >= 1)
        s[step + 1].x1 = xx - 1;
    else if((maze[yy][xx] + step) % 4 == 2 && yy + 1 <= n)
        s[step + 1].y1 = yy + 1;
    else if((maze[yy][xx] + step) % 4 == 3 && yy - 1 >= 1)
        s[step + 1].y1 = yy - 1;
}

void Move2(int step, int n)
{
    int yy = s[step + 1].y2 = s[step].y2;
    int xx = s[step + 1].x2 = s[step].x2;
    if((maze[yy][xx] + step) % 4 == 0 && xx + 1 <= n)
        s[step + 1].x2 = xx + 1;
    else if((maze[yy][xx] + step) % 4 == 1 && xx - 1 >= 1)
        s[step + 1].x2 = xx - 1;
    else if((maze[yy][xx] + step) % 4 == 2 && yy + 1 <= n)
        s[step + 1].y2 = yy + 1;
    else if((maze[yy][xx] + step) % 4 == 3 && yy - 1 >= 1)
        s[step + 1].y2 = yy - 1;
}

int better(int y1, int x1, int y2, int x2)
{
    int dis1 = (y1 - y2) * (y1 - y2);
    int dis2 = (x1 - x2) * (x1 - x2);
    return dis1 + dis2;
}

void dfs(int step, int n)
{
    if(step > 100)
        return;
    if(s[step].x1 == s[step].x2 && s[step].y1 == s[step].y2)
    {
        ans1 = step;
        return;
    }
    if(loop(step))
    {
        ans2 = step;
        return;
    }
    Move1(step, n);
    Move2(step, n);
    int dis[5];
    int Min = inf;
    for(int i = 0; i < 4; ++i)
    {
        dis[i] = inf;
        int yy = s[step + 1].y1 + dir[i][0];
        int xx = s[step + 1].x1 + dir[i][1];
        if(yy >= 1 && yy <= n && xx >= 1 && xx <= n)
            dis[i] = better(yy, xx, s[step].y2, s[step].x2);
        if(dis[i] < Min)
            Min = dis[i];
    }
    if(dis[0] == dis[1] && dis[0] == dis[2] && dis[0] == dis[3]);
    else if(dis[0] == Min)
        s[step + 1].x1++;
    else if(dis[1] == Min)
        s[step + 1].x1--;
    else if(dis[2] == Min)
        s[step + 1].y1--;
    else if(dis[3] == Min)
        s[step + 1].y1++;
    dfs(step + 1, n);
}

int main()
{
    int n;
    int c = 0;
    while(~scanf("%d", &n) && n)
    {
        for(int i = 1; i <= n; ++i)
        {
            getchar();
            for(int j = 1; j <= n; ++j)
            {
                char ch;
                scanf("%c", &ch);
                switch(ch)
                {
                    case 'E': maze[i][j] = 0;break;
                    case 'W': maze[i][j] = 1;break;
                    case 'S': maze[i][j] = 2;break;
                    case 'N': maze[i][j] = 3;break;
                }
            }
        }
        ans1 = ans2 = -1;
        s[0].x1 = s[0].y1 = 1;
        s[0].x2 = s[0].y2 = n;
        dfs(0, n);
        printf("Case %d:\n", ++c);
        if(ans1 == -1 && ans2 == -1)
            printf("Not sure.\n");
        else if(ans1 != -1)
            printf("Get the treasure! At step %d.\n", ans1);
        else
            printf("Impossible. At step %d.\n", ans2);
        printf("\n");
    }
    return 0;
}

 

智能体式AI漫游指南中文版 智能体式AI漫游指南中文版、智能体式AI指南英文原版 立即下载

相关推荐

国央企如何利用AI工具提升科技创新项目管理与成果转化能力?.docx

国央企如何利用AI工具提升科技创新项目管理与成果转化能力?

sdut-2156(模拟,bfs)

Fairy tale Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 It is said that in a school’s underground, there is a huge treasure which can meet any desire of the owner.

whoISVip 677

融合高斯扰动与竞争学习的改进型多目标部落竞争与成员合作算法(IMOCTCM)求解DTLZ1-DTLZ7及-盘式制动器设计研究(Matlab代码实现)

内容概要:本文档名为《Plecs全桥LLC谐振变换器仿真模型.txt》,但实际内容并非聚焦于该主题,而是一份涵盖多个科研领域的Matlab/Simulink仿真资源汇总清单。文档列举了包括多目标优化算法(如IMOCTCM、MOWAA)、电力电子变换器控制(如LLC谐振变换器、DAB变换器)、电机控制(如PMSM无感控制)、状态估计(如卡尔曼滤波)、微电网调度、无人机路径规划、图像处理、信号处理等多个方向的仿真研究课题,涉及Matlab、Python、Simulink、PSCAD等多种工具和编程语言。文档末尾频繁出现“完整资源下载:公众号——荔枝科研社”及百度网盘链接,表明其核心用途是推广和分享一系列科研仿真资料,服务于学术交流与资源共享。; 适合人群:适用于电气工程、自动化、控制科学与工程、电力系统、电子信息、机械电子、计算机科学等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①为科研工作者提供丰富的Matlab/Simulink仿真案例参考和技术实现思路;②辅助高校师生完成课程设计、毕业设计或学术论文复现工作;③通过获取开源共享资源加速个人或团队的项目开发与算法验证进程。; 阅读建议:该文档属于资源目录性质,缺乏连贯的技术论述与逻辑结构,建议使用者根据自身研究方向筛选相关条目,结合提供的代码和模型进行学习与实践,并注意核实所下载资源的有效性、完整性以及代码运行环境的兼容性。

Number Puzzle (ZOJ - 2836 ,容斥原理)

一.题目链接: ZOJ-2836 二.题目大意: 第一行给出 n, m 第二行有 n 个数 求在不大于 M 的非负整数中,有多少个数可以被这 n 个数中的任意一个整除. 三.分析: 容斥原理模板题存一下(偷笑.jpg) 四.代码实现: #include <set> #include <map> #include <ctime> #incl...

The___Flash的博客 862

用LTspice仿真CMOS反相器功耗?这份避坑指南能省你3天调试时间

本文详细介绍了如何使用LTspice准确仿真CMOS反相器的功耗,包括动态功耗、短路功耗和静态功耗的测量技巧。通过工程实践指南,帮助电子工程师避开常见陷阱,优化仿真参数设置,提升仿真结果的可靠性,节省调试时间。

w7x8y9z的博客 189

Adams与matlab联合仿真的一些小技巧

Adams与simulink联合仿真之快速设置初值 去年到现在一直做的两个项目要用到Adams与simulnk联合仿真,虽然网上有很多这方面的教程,但都比较基本,要实现一些稍微复杂的要求就比较困难了,比如我需要改变模型的初始位姿,原来的方式是在adams中设置,再生成联合仿真需要的文件,再在matlab中进行调用和仿真,如果工况多的话这样就特别耗时耗力,进过长时间的摸索,终于找出了在matlab中直接改变Adams模型参数的方法,下面具体说明一下。 我这里的模型是一个小球通过弹簧连接在坐标原点,仿真开始后

weixin_40962901的博客 4785

最大子矩阵(HDU - 1559,前缀和)

一.题目链接: HDU-1559 二.题目大意: 给出一个 m × n 的矩阵,和一个大小为 x × y 的子矩阵,求子矩阵的最大值为多少? 三.分析: 利用前缀和求出 顶点 到 每个点 矩阵的和,然后枚举子矩阵顶点的位置即可. 如图: 四.代码实现: #include <set> #include <map> #include <ctime&g...

The___Flash的博客 608

HttpClient vs OkHttpClient:哪个更适合你的Java项目?(附性能对比实测)

本文深度对比了Apache HttpClient与OkHttpClient在Java项目中的性能表现与适用场景。通过实际性能测试,OkHttp在连接复用、高并发吞吐量及内存占用方面表现更优,尤其适合现代微服务与Spring生态。HttpClient则凭借其高度可配置性,在需要精细控制HTTP协议细节的场景中更具优势。文章提供了清晰的选型指南,帮助开发者根据项目需求做出最佳决策。

onion的博客 510

Plants vs. Zombies (ZOJ - 4062,二分答案 + 细节)

一.题目链接: ZOJ-4062 二.题目大意: n 个植物排成一排. 水壶只能移动 m 步. 水壶一步移动一个单位长度,所到达的位置,该植物的防御值会相应增加. 求浇水之后,所有植物防御值中最小值最大可以为多少. 三.分析: 二分答案即可. 不过要加限制条件,在 check(mid) 函数中 cnt 可能会暴 long long. 这是因为,假设n == 1e5,mid =...

The___Flash的博客 606

IDEA 2023.2最新破解安装教程(含详细配置步骤及常见问题解决)

本文详细介绍了IDEA 2023.2的安装流程及高效开发环境搭建指南,涵盖基础配置、项目结构优化、核心功能使用、插件推荐、性能优化等全方位内容,帮助开发者快速掌握这一强大的Java开发工具。

x2y3z4a5b的博客 1754

1.1什么是Zephyr?与FreeRTOSRT-Thread对比

我自己的项目里,三个系统都用过。这个芯片的原厂BSP哪个OS做得最靠谱?(实测,别看广告)项目核心需求是不是某个OS的“长板”?(别为了10%的功能牺牲90%的稳定性)团队三个月后能不能愉快地维护代码?(开发体验影响长期生产力)最后送一句干货:选型定不下来时,拿一块项目用的开发板,分别用三个OS跑同一个demo(比如按键控制LED+串口打印)。移植过程遇到的问题、代码看起来舒不舒服,你的直觉会告诉你答案。嵌入式没有完美解,只有适合当下的解。选好了,就踏实地写代码;

m0_50546716的博客 654

例题 3-4 猜数字游戏的提示(Master-Mind Hints,UVA 340)

一. 题目链接 : Master-Mind Hints UVA-340 二. 题目大意 : 多组数据,每组数据中有一个标准数字序列,之后多组数字序列,输出 A 和 B. A : 在每组数字序列中,与标准数字序列中数字且位置相同的数字个数. B :在每组数字序列中,有多少个数字在两组数字序列里都出现过,但位置不同. 三.分析 : A : A很好求,直接同时遍历 标准数字序列 和 ...

The___Flash的博客 493

(三)UPF之Domain Coverage Relationship(Cover、Equivalent、Independent)

整个Soc架构中一般会存在多个Power Domain,不同的Power Domain之间也存在着一定的Coverage关系。在Cadence工具中,这种。不同的Domain Coverage关系中,各个Domain存在着一定的关联()。

Mr.翟的博客 1424

Eight II (HDU - 3567,BFS 打表 + 思维)

一.题目链接: HDU-3567 二.题目大意: Eight的升级版,游戏规则相同. 每次给出两个字符串 A, B,问 从 A 到 B 的最少步数 并 打印最小字典序的路径. 三.分析: 看了大神的分析才懂。。。 在这里阐述一下. 只考虑 X 的位置,由于 1 ~ 8 数字无特殊性 所以可将所给的 A 重新编号. 例如 A1:8 7X 6 5 4 3 2 1 编号为 A...

The___Flash的博客 485

点云从入门到精通技术详解100篇-点云的特征检测(续)

对每个维度的序列分别计算 DTW 距离,最后。权重将距离限制在较小的范围内,对于时间跨度大的数据集,过度限制了点对点的路径,同的,因此不能用欧氏距离来计算两个多元时间序列之间的距离,本文选用的是动态时。到的股票数据是未知分类的,因此该数据的相似性分析缺少有效的评价方式,通常需要。时间序列,简而言之,就是与时间相关的数据的集合,应用在生活工作中的方方面。时间序列的分段线性化表示的难点在于如何找出分段点,目前,对于分段点的研究。经过分段线性化之后,每个多元时间序列的维度是相同的,但是每一维的长度是不。

getusushu的博客 334

Android CCodec (四) Output Buffer流程分析

Android 多媒体架构 Codec2 Output Buffer

给大佬递杯卡布奇诺的博客 3264

Kth Minimum Clique(2019牛客暑期多校训练营(第二场)D,K 大完全子图)

一.题目链接: Kth Minimum Clique 二.题目大意: 有 n 个点,有着各自的点权. 给出连通的边. 求权值 k 大的完全子图. 三.分析: 由于 n ≤ 1e3,所以直接暴搜即可. 这里和状压 DP 有点像,搜索的是状态以及对应的权值. 考虑状态的转移,比如在什么情况下,i 点可以加入. 因为是求完全子图,所以现状态应真包含于 i 点的连接点,否则就不是完全图...

The___Flash的博客 465

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Books (ZOJ - 4067,思维 + 理解题意)

一.题目链接: ZOJ-4067 二.题目大意: DreamGrid 去买书,有 n 本书排成一行,价格记为 a[0],a[1] .... a[n - 1]. 若DreamGrid 所带的钱不少于 第 i 本书的价格,则买这本书. 最后DreamGrid 共买了 m 本书. if 不可能买了 m 本书,则输出Imp...

The___Flash的博客 462

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Matrix (POJ - 3685,二分答案 + 二分)

一.题目链接: POJ-3685 二.题目大意: 给 n 和 m. 表示有一个 n × n 的矩阵,求第 m 小的元素的值. 矩阵元素的计算公式: 三.分析: 易得矩阵的元素在同一列上单增. 第一层二分答案. 因为是求第 m 小的数,所以必有 m 个数 ≤答案(数有重复). check(mid) 函数里先枚举列,对于每一列再二分有多少个数 ≤ mid即可. ps: 控制边界...

The___Flash的博客 450

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Fliptile (POJ - 3279, 思维 + 二进制枚举)

一.题目链接: POJ-3279 二.题目大意: 给你一个图,只有 0 和 1. 0 表示白色,1 表示黑色. 每敲击一块砖,这块砖以及它周围四个方向的砖都会转变颜色. 问是否能够将砖块都变为白色 如果可以,输出在最小步数情况下,操作的最小字典序. 否则,输出 "IMPOSSIBLE" 三.分析: 二进制枚举对第一行的操作. 再又第 1 行的状态,确定第 2 行的操作 比如 ...

The___Flash的博客 439

习题 3-5 谜题(Puzzle, ACM/ICPC World Finals 1993, UVA227)

一. 题目链接: Puzzle UVA-227 二.题目大意: 有一个 5 × 5 的字母矩阵,其中有一个是空格。 共有 4 中指令,分别为 A, B, L, R. A:将空格上的相邻字母移到空格中. B:将空格下的相邻字母移到空格中. L:将空格左的相邻字母移到空格中. R:将空格右的相邻字母移到空格中. 输入指令后 若有非法指令输出“This puzzle has no fi...

The___Flash的博客 430

Pearls in a Row( CodeForces - 620C,贪心)

一.题目链接: CodeForces-620C 二.题目大意: 给出一个数字序列,若有数字重复出现则称这一段序列为 “好”,求这个序列中最多有多少个 “好” 序列. 三.分析: 把序列中的元素放入 set 里,并进行查找,若找到,则 ans++,set 清空,记录首尾位置. 详见代码. 四.代码实现: #include <set> #include <map&g...

The___Flash的博客 422

Tunnel Warfare (HDU - 1540,这也能用线段树 ?!)

一.题目链接: HDU-1540 二.题目大意: 有 n 个村庄排列在一条线上,编号为 1 ~ n. 现有 3 种 m 次操作 D x:摧毁第 x 个村庄 Q x:查询与第 x 个村庄相邻的村庄数. R:修复上一个被摧毁的村庄. 三.分析: 当查询与第 x 个村庄相邻的村庄数时 只需要查询在 1 ~ x 中被摧毁村庄的最大编号 && 在 x ~ n 中被摧毁村...

The___Flash的博客 420

Monitor( HDU - 6514 ,子矩阵和 + 前缀和处理)

一.题目链接: HDU-6514 二.题目大意: 给你 p 个红矩阵 一个整数 q,接下来 q 行 每行给出一个蓝矩阵 如果蓝矩阵被完全包含于红矩阵内,输出 "YES",否则输出 "NO". 三.分析: 赛后听 ltr 讲才恍然大悟,不就是这两道题的结合吗?(tql orzzzz) 最大子矩阵(HDU - 1559,前缀和) Color the ball(HDU - 1556...

The___Flash的博客 417

例题 3-6 环状序列(Circular Sequence,ACM/ICPC Seoul 2004,UVA1584)

一.题目链接: Circular Sequence UVA-1584 二.题目大意: 给定一个只含 A , T , C , G 的环形字符串,输出其字典序最小的字符串. 三.分析: 例如CTCC,则根据字典序最小可以写成CCCT. 注意该字符串是环形的,所以应该想到在字符串处理上使用 "%" 运算. 由此,我们只需要找出取余点即可. 那么,就枚举一遍取余点喽,把字典序最小的取余点记...

The___Flash的博客 403
上一篇: Basic Data Structure (HDU - 5929,双端栈模拟 + 思维)
下一篇: Boring count (HDU - 5056,滑动窗口)
The___Flash
博客等级 码龄8年 79粉丝 223原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值