[SCOI2005]骑士精神【迭代加深+IDA*】

2023-10-27

题目链接 P2324 [SCOI2005]骑士精神


首先,我们先讲讲几个基础知识:

迭代加深

  我们假设深度优先搜索(DFS)的最深搜索到Max_depth,那么也就是说深度到达Max_depth的时候不管满不满足答案都要返回了true or false。

IDA*启发式搜索优化DFS

  作为A*算法,也就是有估值函数这样的定义了,原来的深度小于等于Max_depth也将剪枝成为当前的深度deep(表示已经走的路程)+至少需要再走的路程(估值)要小于等于Max_depth才可以走,这就是启发式的思想了。

估值函数

  这里的估值函数肯定是“差距”了,当然是偏小的,不过这没有关系。

inline int _Det()
{
    int sum = 0;
    for(int i=0; i<5; i++) for(int j=0; j<5; j++) if(a[i][j] ^ Bas[i][j]) sum++;
    return sum;
}

启发式搜索

bool dfs(int x, int y, int deep, int Lim_depth)
{
    if(deep == Lim_depth && !_Det()) return true;
    else if(deep == Lim_depth) return false;
    for(int i=0, xx, yy; i<8; i++)
    {
        xx = x + dir[i][0]; yy = y + dir[i][1];
        if(!In_Map(xx, yy)) continue;
        swap(a[x][y], a[xx][yy]);
        if(deep + _Det() <= Lim_depth && dfs(xx, yy, deep + 1, Lim_depth)) return true; //at last turn one exchange tuo
        swap(a[x][y], a[xx][yy]);
    }
    return false;
}

  这里的判断条件是“deep + _Det() <= Lim_depth”是因为最后一次移动,可能一次性会改变两个值,所以本身应该是“deep + 1 + _Det() - 1 <= Lim_depth”。

Code

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f3f3f3f3f
#define eps 1e-8
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(a, b) make_pair(a, b)
#define MAX_3(a, b, c) max(a, max(b, c))
#define MAX_4(a, b, c, d) max(max(a, b), max(c, d))
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int Bas[5][5] =
{
    1, 1, 1, 1, 1,
    0, 1, 1, 1, 1,
    0, 0, 2, 1, 1,
    0, 0, 0, 0, 1,
    0, 0, 0, 0, 0
};
const int dir[8][2] =
{
    -1, -2,
    -1, 2,
    1, -2,
    1, 2,
    -2, -1,
    -2, 1,
    2, -1,
    2, 1
};
inline bool In_Map(int x, int y) { return x >= 0 && y >= 0 && x < 5 && y < 5; }
char mp[5][5];
int a[5][5];
inline int _Det()
{
    int sum = 0;
    for(int i=0; i<5; i++) for(int j=0; j<5; j++) if(a[i][j] ^ Bas[i][j]) sum++;
    return sum;
}
bool dfs(int x, int y, int deep, int Lim_depth)
{
    if(deep == Lim_depth && !_Det()) return true;
    else if(deep == Lim_depth) return false;
    for(int i=0, xx, yy; i<8; i++)
    {
        xx = x + dir[i][0]; yy = y + dir[i][1];
        if(!In_Map(xx, yy)) continue;
        swap(a[x][y], a[xx][yy]);
        if(deep + _Det() <= Lim_depth && dfs(xx, yy, deep + 1, Lim_depth)) return true; //at last turn one exchange tuo
        swap(a[x][y], a[xx][yy]);
    }
    return false;
}
int main()
{
    int T; scanf("%d", &T);
    while(T--)
    {
        for(int i=0; i<5; i++)
        {
            scanf("%s", mp[i]);
            for(int j=0; j<5; j++)
            {
                a[i][j] = mp[i][j] == '*' ? 2 : mp[i][j] - '0';
            }
        }
        if(!_Det()) { printf("0\n"); continue; }
        int sx = 0, sy = 0;
        for(int i=0; i<5; i++) for(int j=0; j<5; j++)
        {
            if(a[i][j] == 2) { sx = i; sy = j; break; }
        }
        bool flag = false;
        for(int i=1; i<=15; i++)
        {
            if(dfs(sx, sy, 0, i))
            {
                flag = true; printf("%d\n", i);
                break;
            }
        }
        if(!flag) printf("-1\n");
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[SCOI2005]骑士精神【迭代加深+IDA*】 的相关文章

  • Railway HDU - 3394(tarjan应用)

    题目 有一个公园有n个景点 公园的管理员准备修建m条道路 并且安排一些形成回路的参观路线 如果一条道路被多条道路公用 那么这条路是冲突的 如果一条道路没在任何一个回路内 那么这条路是不冲突的 问分别有多少条有冲突的路和没有冲突的路 题解 1
  • 【数模】基于PageRank算法的学术论文重要性排序问题(matlab实现)

    基于PageRank算法的学术论文排序问题 matlab实现 问题描述 六篇学术论文的引用关系如图 A 指向 B 表示 A 引用 B 试排出它们重要性的顺序 问题分析 就是给节点来个重要性排序 PageRank简介 PageRank 又称网
  • Connections between cities 【HDU - 2874】【在线LCA算法】

    题目链接 昨天刚学了在线LCA 今天就来硬刚这道题还是花了一整天的时间 不过对于LCA却有了更多的理解 这道题在讲述不同根的做法上尤其是很好的 题目告诉我们有N个节点和M条边 以及C次询问 每次查询的是 L R 这两个节点间的距离 还是算得
  • AcWing 1055. 股票买卖 II

    输入样例1 6 7 1 5 3 6 4 输出样例1 7 输入样例2 5 1 2 3 4 5 输出样例2 4 输入样例3 5 7 6 4 3 1 输出样例3 0 样例解释 样例1 在第 2 天 股票价格 1 的时候买入 在第 3 天 股票价格
  • 图论进阶指南-银河(差分约束/DAG/tarjan)

    测评地址 题目大意 第一行给出两个整数N和M 之后M行 每行三个整数T A B 表示一对恒星 A B 之间的亮度关系 恒星的编号从1开始 如果T 1 说明A和B亮度相等 如果T 2 说明A的亮度小于B的亮度 如果T 3 说明A的亮度不小于B
  • LeetCode-剑指 Offer II 114. 外星文字典,BFS 搜索算法及图的表示

    剑指 Offer II 114 外星文字典 现有一种使用英语字母的外星文语言 这门语言的字母顺序与英语顺序不同 给定一个字符串列表 words 作为这门语言的词典 words 中的字符串已经 按这门新语言的字母顺序进行了排序 请你根据该词典
  • hdu 2586 How far away ?

    Problem acm hdu edu cn showproblem php pid 2586 Meaning 给一棵 n 个点的树 和 n 1 条边的边权 多次询问树上两点的距离 Analysis 以任意顶点为根 DFS 预处理出所有结点
  • 2021级新生个人训练赛第38场

    问题 A chicken 题目描述 小 x 非常喜欢小鸡翅 他得知 NSC 超市为了吸引顾客 举行了如下的活动 一旦有顾客在其他超市找到更便宜的小鸡翅 NSC 超市将免费送给顾客 1000g 小鸡翅 小 x 为了尽可能的省钱 走遍了各大超市
  • PCL点云处理之批量读写点云、随机赋予颜色 并保存

    include
  • 大学生团体天梯赛(第五届)

    题目地址 天梯赛 include
  • [UVA1364

    评测地址 网址1 网址2 题目描述 题意 给出n位骑士 然后有m个关系 每个关系以格式 a b a b a b给出 表达骑士 a a
  • 数据结构练习题——图(含应用题)

    1 选择题 1 在一个图中 所有顶点的度数之和等于图的边数的 倍 A 1 2 B 1 C 2 D 4 答案 C 2 在一个有向图中 所有顶点的入度之和等于所有顶点的出度之和的 倍 A 1 2 B 1 C 2 D 4 答案 B 解释 有向图所
  • UVA-10603 倒水问题 题解答案代码 算法竞赛入门经典第二版

    GitHub jzplp aoapc UVA Answer 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 使用广度优先搜索和优先队列 如果找到最小的点则退出 找不到就遍历所有的情况 include
  • 【算法笔记】Prim算法

    定义 prim算法 图论中的一种算法 可在加权连通图里搜索最小生成树 由此算法搜索到的边子集所构成的树中 不但包括了连通图里的所有顶点 并且其所有边的权值之和最小 算法描述 输入 一个加权连通图 其中顶点集合为V 边集合为E 初始化 Vne
  • 2023杭电暑假多校4 题解

    3 Simple Set Problem 题意 k 个多重集合 每个集合选出一个数形成新集合A 求 m a x A m
  • The Necklace 【UVA - 10054】【欧拉回路详解】

    题目链接1 题目链接2 题目求的是一串珠子 要让它们首尾相互照应才能串起来 并且 最后要连成一个环 使得最后的珠子的尾与第一个珠子的头相互对应 那么 这道题就是道求欧拉回路的题了 我们要先判断这是不是能够构成欧拉回路 这是个无向图 再对于需
  • BFS遍历树和DFS遍历树

    遍历树 按照遍历的顺序 如不清楚图的遍历 请先阅读图的遍历 绘制成树型结构 DFS遍历树 以下为图到遍历树的转化 如果不清楚图的遍历 请先阅读笔者的另一篇文章 图的遍历 动图 按照DFS遍历的顺序 绘制成一棵树 途中红色的边就是遍历过程中没
  • E (1052) : DS树--带权路径和

    文章目录 一 题目描述 二 输入与输出 1 输入 2 输出 三 参考代码 一 题目描述 计算一棵二叉树的带权路径总和 即求赫夫曼树的带权路径和 已知一棵二叉树的叶子权值 该二叉树的带权路径和APL等于叶子权值乘以根节点到叶子的分支数 然后求
  • 860.染色法判定二分图

    二分图是指一个图中的所有顶点可以分为两部分 并且每条边连接的是属于不同部分的两个顶点 include
  • 860.染色法判定二分图

    二分图是指一个图中的所有顶点可以分为两部分 并且每条边连接的是属于不同部分的两个顶点 include

随机推荐

  • 颜色选择器(拾色器)

    今天项目中用到了拾色器 感觉挺好 Html如下 html开始分割线 Color
  • [官方教程] Firefly 介绍文档!

    欢迎来9秒 www 9miao com Firefly是免费 开源 稳定 快速扩展 能 热更新 的分布式游戏服务器端框架 采用Python编写 基于Twisted框架开发 它包括了开发框架和数据库缓存服务等各种游戏服务器基础服务 节省大量游
  • [YOLO专题-14]:YOLO V5 - ultralytics在自定义数据集上获得高性能的常见关键项

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122302497 目录 前言 第1步
  • linux 里面case的用法

    linux 里面case的用法 用来选择 如下图所示 bin bash NAME cluster app echo NAME if 1 1 then echo i am true fi start echo 我要开始执行start 命令了
  • DHTMLX JavaScript Gantt Chart 8.0.5 Crack

    8 0 5 September 1 2023 Bugfix release Fixes Fix incorrect warnings triggered by enabling extensions via the gantt getGan
  • PPTP、L2F、L2TP协议

    PPTP协议简介 PPTP Point to Point Tunneling Protocol 即点对点隧道协议 该协议是在PPP协议的基础上开发的一种新的增强型安全协议 支持多协议虚拟专用网 VPN 可以通过密码验证协议 PAP 可扩展认
  • UNIX网络编程卷一 学习笔记 第六章 I/O复用:select和poll函数

    上一章中 TCP客户同时处理两个输入 标准输入和TCP套接字 我们遇到的问题是客户阻塞于标准输入上的fgets调用期间 服务器进程被杀死时 虽然服务器TCP正确地给客户TCP发送了一个FIN 但客户进程正阻塞于从标准输入读的过程 它将看不到
  • 常用Fibonacci数性质

    常用Fibonacci数性质 0 Fn 1 Fn 2 Fn 特殊的F0 1 F1 1 上述式子为定义式 1 F 0 F 1 F n F n 2 1 证明 F0 F1 F2 F1 F2 F3 F2 F3 F4 Fn Fn 1 Fn 2 F0
  • Understanding SQL Server Query Plans

    ore than any other tuning you can perform creating efficient queries will always give you the most return for your time
  • 把一个微服务java程序打成jar包

    运行命令 java jar kayu jar
  • webpack升级报错之Module build failed (from ./node_modules/_vue-loader@13.7.3@vue-loader/index.js)

    webpack3 升级webpack4 老的项目依赖经常遇见以下报错 Module build failed from node modules vue loader 13 7 3 vue loader index js TypeError
  • 浅析人脸识别算法及其应用

    前言 随着深度学习和计算机硬件的快速发展 基于深度卷积神经网络的一系列算法都取得了显著的进展 其中人脸识别作为计算机视觉领域中时间最久远 应用最广泛的研究课题之一 近些年也在深度学习的加持下在性能方面获得了大幅提升 并在实际的生活场景中得到
  • 全面升级!“ChatGPT中文版”场景导航功能震撼登场

    近日 ChatGPT中文版 智元兔 平台推出全新的场景功能 为用户提供更全面 高效的智能问答服务 再也不用担心找不到适合自己的场景入口了 此次升级涵盖了60多个场景 包括论文助手 公司文案 营销文案 多语言翻译 行政公文 科研课题 招投标书
  • 绅士领域服务器不稳定,绅士云服务器

    绅士云服务器 内容精选 换一换 根据后端云服务器组的ID查询后端云服务器组详情 GET v2 0 lbaas pools pool id 无请求样例 查询后端云服务器组的详情GET https Endpoint v2 0 lbaas poo
  • vue2实现一个树型控件(支持展开树与checkbox勾选)

    目录 vue2实现一个树型控件 支持展开树与checkbox勾选 TreeItem vue Tree vue 效果 vue2实现一个树型控件 支持展开树与checkbox勾选 TreeItem vue
  • 物联网专业课程简介及理解

    写在前面 大家好 我是草莓橙须圆 毕业之前在CSDN和微信公众号活跃 欢迎关注我的公众号 草莓橙须圆 微信公众号主要就是更新大学生或者考研党的日常 CSDN主要就是学习过程中总结的笔记 以及编程分享 目录 物联网 软件工程 数据库 传感器与
  • torchsparse1.4.0 安装

    1 sudo apt get install libsparsehash dev 2 pip install upgrade git https github com mit han lab torchsparse git v1 4 0 p
  • Linux centos7关闭防火墙

    1 命令行界面输入命令 systemctl status firewalld service 并按下回车键 2 然后在下方可度以查看得到 active running 此时说明防火墙已经被打开了 root a1663303 systemct
  • 区块链系统运行逻辑

    文章目录 一 开发工具 二 程序运行完整逻辑 2 1 总体逻辑 2 2 详细过程 以添加数据 AddData 为例 一 开发工具 hyperledger fabric 1 4 7 hyperledger ca 1 4 7 ca是用来生成证书
  • [SCOI2005]骑士精神【迭代加深+IDA*】

    题目链接 P2324 SCOI2005 骑士精神 首先 我们先讲讲几个基础知识 迭代加深 我们假设深度优先搜索 DFS 的最深搜索到Max depth 那么也就是说深度到达Max depth的时候不管满不满足答案都要返回了true or f