洛谷题单指南-进阶搜索-P2324 [SCOI2005] 骑士精神

news/2025/2/21 9:29:05/文章来源:https://www.cnblogs.com/jcwy/p/18722626

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

题意解读:在5*5棋盘,12个0,12个1,还有一个*,0或1可以和*交换,交换的两个位置必须是类似马走日,给定初始状态,求最少经过多少步可以到达目标状态。

解题思路:要计算最少步数,首先想到BFS,但是由于每一步有8种状态,直接BFS必然超时爆内存。

题目限制在15步之内,可以采用迭代加深方式,再加上启发性剪枝,也就是IDA*算法,才能通过本题。

所谓IDA*算法, 就是在迭代加深的基础上,每次判断当前状态stat已搜索步数和最大步数的关系if(depth > maxdepth) return false时,加入一个估价函数f(stat),f(stat)表示从当前状态stat到达目标状态的最小步数,剪枝变成:

if(depth + f(start) > maxdepth) return false;

这样可以极大减少搜索的状态数。

对于本题,估价函数可以这样设计:统计每个位置与目标位置不同的个数,不考虑*所在位置的不同,因为0/1如果归位了,*自然就归位了。

100分代码:

#include <bits/stdc++.h>
using namespace std;int t;
/*
目标终点:
11111
01111
00*11
00001
00000
转化成一维:111110111100*110000100000
*/
string target = "111110111100*110000100000";
int dx[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};//估价函数,返回当前状态与目标状态的不同位置的个数
int f(string stat)
{int res = 0;for(int i = 0; i < 25; i++){//只需要考虑24个骑士的位置是否正确,不需要考虑*的位置,因为骑士如果都归位了,*也就归位了if(stat[i] != target[i] && stat[i] != '*') res++;}return res; 
}// 从start状态开始搜索,当前搜索深度为depth,最大搜索深度为maxdepth
bool dfs(string start, int depth, int maxdepth)
{if(depth + f(start) > maxdepth) return false; //剪枝,如果当前深度加上估价函数值大于最大深度,那么就不用继续搜索了if(start == target) return true;int pos = start.find('*'); //找到*的位置int x = pos / 5, y = pos % 5; //计算*的坐标for(int i = 0; i < 8; i++){int nx = x + dx[i], ny = y + dy[i]; //计算下一个位置if(nx < 0 || nx > 4 || ny < 0 || ny > 4) continue;int npos = nx * 5 + ny; //计算下一个位置的一维坐标string tmp = start;swap(tmp[pos], tmp[npos]);if(dfs(tmp, depth + 1, maxdepth)) return true;}return false;
}int main()
{cin >> t;while(t--){string s, line;for(int i = 0; i < 5; i++){cin >> line;s += line;}int maxdepth;for(maxdepth = 0; maxdepth <= 15; maxdepth++) //迭代加深{if(dfs(s, 0, maxdepth)) break;}if(maxdepth <= 15) cout << maxdepth << endl; else cout << -1 << endl;}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/886738.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CClink IEF Basic设备数据 转EthernetIP项目案例

VFBOX协议转换网关支持PLC,modbus,EthernetIP,Profinet,CCLink,EtherCAT,IEC61850,IEC104,bacnet,DLT645,HJ212,opc ua,opc da,DNP3。目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关采集CCLINK IEF BASIC数据 2 5 使用ETHERNETIP转发数据 5 6 案例…

SciTech-EECS-BigDataAIML-NN(神经网络): Forward NN(前向传播算法)

SciTech-EECS-BigDataAIML-NN(神经网络): Forward NN(前向传播算法)

微信小程序-实现微信授权自动登录功能

显示效果 授权前界面授权弹框界面 采用了wx.getUserProfile API申请用户信息,若基础库版本过高,例如3.7.7,则不会显示弹窗,默认为允许状态。若基础库版本降低,例如2.25.4,则会显示弹窗,如下图所示授权后界面前端部分 基础封装 新建utils文件夹,在该文件夹下新建login.j…

为DeepSeek添加本地知识库

为什么要尝试给DeepSeek添加本地知识库呢?作为一个程序员,以前也用过很多AI产品,直到春节DeepSeek爆火,成功在自己的电脑上把AI模型跑起来的时候才真正感受到AI已近在咫尺。未来很多应用和项目都离不开这个工具。或许在我们OA系统中会出现一个AI小助手,我们会问它差旅费报…

SciTech-EECS-Circuits-Digital(数字电路): Latch(锁存器) + Flip/Flop(触发器) + 记忆存储电路

SciTech-EECS-Circuits-Digital(数字电路) Latch(锁存器)Flip/Flop(触发器)记忆存储电路

山石网科阿里云通义灵码,开启研发“AI智造”新时代

近日,山石网科正式宣布全面接入阿里云通义灵码企业专属版,这标志着山石网科在研发智能化、自动化领域迈出重要一步,为研发工作注入强大的AI动力,实现多维度的效率飞跃。近日,山石网科正式宣布全面接入阿里云通义灵码企业专属版,这标志着山石网科在研发智能化、自动化领域…

frame/tab 切换,一些技巧

点击这里,边看视频讲解,边学习以下内容 frame切换 请大家点击这里,打开这个链接 如果我们要 选择 下图方框中 所有的 蔬菜,使用css选择,怎么写表达式? 当然,要先查看到它们的html元素特征大家可能会照旧写出如下代码:from playwright.sync_api import sync_playwrightp…

CSS选择器 定位方法

定位元素的重要性 前面这段代码from playwright.sync_api import sync_playwrightp = sync_playwright().start() browser = p.chromium.launch(headless=False) page = browser.new_page() page.goto("https://www.byhy.net/cdn2/files/selenium/stock1.html")# 输入…

Arduino-Esp8266 OTA升级

#include <ESP8266WiFi.h> #include <ESP8266httpUpdate.h> #include <Ticker.h>/******需要修改的地方****************/#define wifi_name "GT-2G" //WIFI名称,区分大小写,不要写错 #define wifi_password "gt#@10000" …

【IDEA】idea接入AutoDev插件并配置DeepSeek

1. AutoDev Quick Start https://ide.unitmesh.cc/quick-start2. AutoDev 下载 https://github.com/unit-mesh/auto-dev/releases3. 根据IDEA版本进行下载 比如我的IDEA版本是2024.3.2.1 那么我应该下载的就是241.zip 需要根据最新的quick-start去release下载对应版本 4. IDEA…

CF559E Gerald and Path 题解

CF559E Gerald and Path 很困难的 DP 题,状态不是很好想。对于这种线段覆盖类题目,显然先覆盖哪个线段没有影响,我们可以通过按照端点位置升序排序后按照顺序考虑,这样可能会有一些额外性质。 之后,考虑转移时需要什么东西来刻画一个状态的轮廓。显然我们需要知道现在是第…