首页 > 其他分享 >[ABC176D] Wizard in Maze

[ABC176D] Wizard in Maze

时间:2024-11-23 16:24:39浏览次数:5  
标签:bfs 魔法 int Wizard ABC176D nx ny step Maze

谁没事手撸魔法方向数组啊

正解:

题目上说最少使用几次魔法,因此一定是正常上下左右移动的优先级更高。

bfs 的特点就是会先算队首,这也就意味着队首的优先级更高。

从队首入队,需要使用 deque。此题中的 step 数组用于记录到当前点用了多少次魔法。

#include <bits/stdc++.h>
using namespace std;
struct p{
    int x, y;
};
int h, w, a, b, x, y, step[1005][1005];
//正常上下左右移动
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
//魔法方向数组
int sy[] = {-2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2};
int sx[] = {-2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2};
void bfs(){
    deque<p> q;//双端队列
    q.push_back({a, b});//初始起点入队
    step[a][b] = 0;//初始时最少使用0次魔法
    while(!q.empty()){
        int mx = q.front().x, my = q.front().y;
        q.pop_front();
        for(int i = 0; i <= 3; i++){//上下左右移动的
            int nx = mx + dx[i], ny = my + dy[i];
            //越界
            if(nx > h || ny > w || nx < 1 || ny < 1)continue;
            //一个点可以重复走过,但如果新的次数还大于原来的就不用往下找了,一定不会是最优解
            if(m[nx][ny] == '#' || step[nx][ny] <= step[mx][my])continue;
            step[nx][ny] = step[mx][my];
            q.push_front({nx, ny});//正常的优先级高,放前面
        }
        for(int i = 0; i <= 23; i++){//使用魔法的
            int nx = mx + sx[i], ny = my + sy[i];
            if(nx > h || ny > w || nx < 1 || ny < 1)continue;
            if(m[nx][ny] == '#' || step[nx][ny] <= step[mx][my] + 1)continue;
            step[nx][ny] = step[mx][my] + 1;
            q.push_back({nx, ny});//使用魔法的的优先级低,放后面
        }
    }
    if(step[x][y] != 0x3f3f3f3f) cout << step[x][y];//能走到
    else cout << -1;
}
int main(){
    memset(step, 0x3f, sizeof(step));//初始化,以免在取最小值时全为0
    cin >> h >> w >> a >> b >> x >> y;
    for(int i = 1; i <= h; i++)
        for(int j = 1; j <= w; j++)
            cin >> m[i][j];
    bfs();
    return 0;
}

标签:bfs,魔法,int,Wizard,ABC176D,nx,ny,step,Maze
From: https://www.cnblogs.com/KukCair/p/18564694

相关文章

  • 【视频教程】手把手AppWizard轻松制作一个emWin滑动主界面控制框架,任意跳转控制(2024-0
    现在的新版AppWizard已经比较好用,用户可以轻松的创建各种项目常规界面。比如早期创建一个支持滑动的主界面框架,并且可以跳转各种子界面,仅仅界面布局和各种图片格式转换都要花不少时间,而现在使用AppWizard,可以说轻轻松松,毫不费力。用户唯一要做的就是根据自己的芯片性能做一定的......
  • Clocking Wizard IP使用
    简介本章节主要针对XILINX的PLLIP做详细介绍,并通过AXILite总线对时钟在线配置。VIVADO界面选择clockingwizardIP具体介绍如下:PLLIP介绍clockingoption界面1、MMCM和PLL选择;        (1)PLL:为锁相回路或锁相环,用来统一整合时钟信号,使高频器件正常工作,如内存......
  • 【Pwn】(未解决)maze - writeup
    1.运行函数,收集字符串获取关键词字符串:luck2.寻找字符串引用代码3.生成伪代码4.获得main函数的C语言代码5.分析程序逻辑check函数:main函数int__fastcallmain(intargc,constchar**argv,constchar**envp){ unsignedintv3;//edx charv5;//[r......
  • 2024牛客暑期多校训练营1 I.Mirror Maze(题解)
    题意给一个\(n\timesm\)的二维char数组,由4种镜子组成,'\','/','-','|',镜面反射规则就是根据光线的方向和镜面的角度符合直觉的反射,然后有多组询问\(q\leq10^6\),每次给定起始位置和光线方向,求该光会经过多少面不同的镜子的反射。思路首先根据数据范围,发现肯定需要预处......
  • A. Bitwise Operation Wizard
    原题链接题解1.坐标i,j中,一定有一个值为n-12.所以另外一个数就是n-1在二进制表示下0的位置变成1,1的位置变成0的数3.如何找到最大值?答:自己和自己或找出最大的4.如何找到另外一个数?答:找出和最大值或最大的,再找出这些数中最小的code#include<bits/stdc++.h>usingnamespacest......
  • [ABC176D] Wizard in Maze
    题目链接:https://atcoder.jp/contests/abc176/tasks/abc176_d双端队列bfs模版题.众所周知,用队列实现bfs,队列中存的是当前的状态那么在当前这种题目中,下一步怎么走有两种决策,我们要把两种决策可能导致的状态更新全部都记录下来,因此我们可以用双端队列来实现bfs,把正常走的......
  • QuartusII调用 PLL_IP核方法(Mega Wizard)
    【基本信息】要求:调用PLL—IP核,50Mhz晶振输入,输出四路时钟不同信号:100Mhz,25Mhz,50Mhz(90°相位),50Mhz(20%占空比)。芯片型号:cycloneⅣEP4CE10F17C8平台工具:QuartusII15.0(64-bit)、ModelsimSE-6410.4【PLL_IP核简介】IP核:ASIC或FPGA中预先设计好具有某种功能的电路模块,参......
  • Q-learning 玩maze游戏
     importpygameimportnumpyasnpimportrandomimportsys#定义迷宫环境classMaze:def__init__(self):self.size=10self.maze=np.zeros((self.size,self.size))self.start=(0,0)self.goal=(9,9)self.m......
  • vivado 使用“Set Up Debug”Wizard 来插入调试核
    使用“SetUpDebug”Wizard来插入调试核标记要调试的信号线(net)后,下一步是将其分配到调试核。VivadoDesignSuite提供了易于使用的“设置调试(SetupDebug)”Wizard,以帮助逐步指导您完成自动创建调试核并将调试信号线分配至核的输入的整个过程......
  • 八臂迷宫实验(Eight-arm Maze Test,RMT)——KT-0854
    八臂迷宫实验是一种常用的行为学测试方法,用于评估动物的空间学习和记忆能力。该实验装置由八个相同的臂组成,这些臂从中心点平台放射出来,形成一个放射迷宫结构。动物在迷宫内接受训练,通过食物的驱使来探究各臂,进而记住食物在迷宫中的空间位置。这种方法不仅可以评估动物的工作记......