《P2324 [SCOI2005] 骑士精神》

article/2025/8/22 3:06:34

题目描述

输入格式

第一行有一个正整数 T(T≤10),表示一共有 T 组数据。

接下来有 T 个 5×5 的矩阵,0 表示白色骑士,1 表示黑色骑士,* 表示空位。两组数据之间没有空行。

输出格式

对于每组数据都输出一行。如果能在 15 步以内(包括 15 步)到达目标状态,则输出步数,否则输出 -1

输入输出样例

输入 #1复制

2
10110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100

输出 #1复制

7
-1

说明/提示

代码实现;

#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <set>
#include <utility>
using namespace std;

// 目标状态
const string target = "111110111100*110001100001";

// 骑士的8个可能移动方向
const int dx[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
const int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};

// 将矩阵转换为字符串
string matrixToString(const vector<string>& matrix) {
    string s;
    for (int i = 0; i < 5; ++i) {
        s += matrix[i];
    }
    return s;
}

// BFS求解最小步数
int bfs(const vector<string>& startMatrix) {
    string start = matrixToString(startMatrix);
    if (start == target) return 0;

    queue<pair<string, int> > q;
    set<string> visited;

    q.push(make_pair(start, 0));
    visited.insert(start);

    while (!q.empty()) {
        string current = q.front().first;
        int steps = q.front().second;
        q.pop();

        if (steps > 15) continue;

        int pos = current.find('*');
        int x = pos / 5;
        int y = pos % 5;

        for (int i = 0; i < 8; ++i) {
            int nx = x + dx[i];
            int ny = y + dy[i];

            if (nx >= 0 && nx < 5 && ny >= 0 && ny < 5) {
                string next = current;
                swap(next[pos], next[nx * 5 + ny]);

                if (next == target) return steps + 1;

                if (visited.find(next) == visited.end()) {
                    visited.insert(next);
                    q.push(make_pair(next, steps + 1));
                }
            }
        }
    }

    return -1;
}

int main() {
    int T;
    cin >> T;
    
    // 读取并处理T组数据
    for (int t = 0; t < T; ++t) {
        vector<string> matrix(5);
        
        // 确保读取5行有效数据
        for (int i = 0; i < 5; ) {
            string line;
            getline(cin, line);
            
            // 跳过空行(如果存在)
            if (line.empty()) continue;
            
            // 存储有效行
            matrix[i] = line;
            i++;
        }

        int result = bfs(matrix);
        cout << result << endl;
    }

    return 0;
}


http://www.hkcw.cn/article/ZWFZOqtfQe.shtml

相关文章

XMOS以全新智能音频及边缘AI技术亮相广州国际专业灯光音响展

全球领先的边缘AI和智能音频解决方案提供商XMOS于5月27-30日亮相第23届广州国际专业灯光、音响展览会&#xff08;prolight sound Guangzhou&#xff0c;以下简称“广州展”&#xff0c;XMOS展位号&#xff1a;5.2A66&#xff09;。在本届展会上&#xff0c;XMOS将展出先进的音…

吉林大学操作系统上级实验四(hash存储讲解及顺序存储文件管理实现)

此章节书上内容既包括文件操作&#xff0c;又包括hash存储的实现&#xff0c;较复杂。 先讲解一下涉及的文件操作&#xff1a; 文件操作&#xff1a; 一.creat系统调用 图一 create函数原型(图中pachname应为pathname) 当调用creat函数时&#xff0c;它会尝试创建一个名为p…

消息队列-kafka为例

目录 消息队列应用场景和基础知识MQ常见的应用场景MQ消息队列的两种消息模式如何保证消息队列的高可用&#xff1f;如何保证消息不丢失&#xff1f;如何保证消息不被重复消费&#xff1f;如何保证消息消费的幂等性&#xff1f;重复消费的原因解决方案 如何保证消息被消费的顺序…

基于Docker和YARN的大数据环境部署实践最新版

基于Docker和YARN的大数据环境部署实践 目的 本操作手册旨在指导用户通过Docker容器技术&#xff0c;快速搭建一个完整的大数据环境。该环境包含以下核心组件&#xff1a; Hadoop HDFS/YARN&#xff08;分布式存储与资源调度&#xff09;Spark on YARN&#xff08;分布式计算…

图片压缩工具 | 发布到咸鱼并配置网盘自动发货

OPEN-IMAGE-TINY&#xff0c;一个基于 Electron VUE3 的图片压缩工具&#xff0c;项目开源地址&#xff1a;https://github.com/0604hx/open-image-tiny 在上一篇文章ElectronVue3Rsbuild开发桌面应用中&#xff0c;我们已经完成了程序的开发&#xff0c;可以发布给别人使用啦…

ASP.NET Core OData 实践——Lesson7使用Reference增删改查一对多Navigation Property(C#)

大纲 主要模型设计支持的接口控制器设计数据源查询(GET)查询基类类型Entity的导航属性查询派生类型Entity的导航属性查询基类类型Entity的导航属性集合中指定Entity查询派生类类型Entity的导航属性集合中指定Entit 新增(POST)和 完整更新(PUT)向基类类型Entity的导航属性建立或…

无需自建高防:APP遭遇DDoS的解决方案

2021年&#xff0c;某知名电商平台在"618"大促期间遭遇DDoS攻击&#xff0c;支付系统瘫痪近2小时&#xff1b;2022年&#xff0c;一款热门手游在新版本上线时因CC攻击导致服务器崩溃。 据观察&#xff0c;电商大促、暑期流量高峰和年末结算期等关键商业周期&#xf…

满天星之canvas实现【canvas】

展示 文章目录 展示Canvas 介绍【基础】简介兼容性关键特性注意事项应用场景&#xff1a;基本示例 满天星代码实现【重点】代码解释 全量代码【来吧&#xff0c;尽情复制吧少年】html引入JS代码 参考资源 Canvas 介绍【基础】 简介 Canvas是一个基于HTML5的绘图技术&#xff0…

余承东揭秘16:10屏幕比例设计原因 以用户体验定义手机形态

华为Pura X系列阔折叠手机于今年3月正式发布,新机出厂搭载鸿蒙HarmonyOS 5系统,首发鸿蒙AI和全新小艺,定价7499元。华为常务董事、终端BG董事长余承东解释了Pura X阔折叠手机采用16:10屏幕比例的原因。他表示,近年来手机进入全面屏时代,业界为了追求更大的屏幕并解决散热问…

高考人数8年来首降释放什么信号 适龄人口减少成主因

高考人数8年来首降释放什么信号 适龄人口减少成主因!5月28日,教育部公布2025年全国高考报名人数为1335万人,比去年的1342万人减少7万人。这是自2017年以来高考报名人数首次出现下降。近年来,高考人数的变化趋势备受社会关注。过去十年中,2015年至2017年的高考报名人数保持…

北京密云一女孩手指卡在椅缝中,消防员紧急破拆救援 近期多起类似事件提醒注意安全

近日,北京市密云区消防救援支队接到多起手指被卡的警情。5月28日下午,一名学生手指卡在座椅铁架的小孔里,消防员迅速到场,先拆解座面木板,再用剪切钳和钢锯小心作业,最终成功帮助学生脱困。次日上午,另一名学生手指被卡在塑料文具尺子孔内,消防员利用钳子在尺子上剪出一…

MinVerse 3D触觉鼠标的技术原理与创新解析

MinVerse3D触觉鼠标通过三维交互和触觉反馈技术&#xff0c;彻底颠覆了传统二维鼠标的操作方式。用户在操作虚拟物体时&#xff0c;可以真实感知表面质感、重量和阻力。这种技术不仅为数字环境注入了深度与临场感&#xff0c;还在3D设计、游戏开发和工程仿真等领域展现了广泛潜…

JAVA:Kafka 消息可靠性详解与实践样例

🧱 1、简述 Apache Kafka 是高吞吐、可扩展的流处理平台,在分布式架构中广泛应用于日志采集、事件驱动和微服务解耦场景。但在使用过程中,消息是否会丢?何时丢?如何防止丢? 是很多开发者关心的问题。 Kafka 提供了一套完整的机制来保障消息从生产者 ➜ Broker ➜ 消费…

韩国男子强闯中国使馆被判刑一年半 多项罪名成立

韩国首尔中央地方法院于28日宣判,一名曾强闯中国驻韩使馆的韩国男子安某因触犯多项罪名被判处一年半有期徒刑。今年2月,安某身穿漫威电影人物“美国队长”服装试图强行进入中国驻韩大使馆,在与警方发生冲突后被捕。调查显示,安某是前总统尹锡悦的支持者。除了试图强闯中国大…

Java设计模式从基础到实际运用

第一部分&#xff1a;设计模式基础 1. 设计模式概述 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的代码设计经验的总结&#xff0c;它描述了在软件设计过程中一些不断重复出现的问题以及该问题的解决方案。设计模式是在特定环境下解决软件设计问题…

Axure设计案例——科技感立体柱状图

想让你的数据展示告别平淡无奇&#xff0c;成为吸引全场目光的焦点吗&#xff1f;快来瞧瞧这个Axure设计的科技感立体柱状图案例&#xff01;科技感设计风格借助逼真的立体效果打破传统柱状图的平面感&#xff0c;营造出一种令人眼前一亮的视觉震撼。每一个柱状体都仿佛是真实存…

韩国男子强闯中国驻韩使馆被判一年六个月 多项罪名成立

韩国首尔中央地方法院于28日宣判,一名强闯中国驻韩使馆的韩国男子安某因触犯多项罪名,获刑一年半。今年2月,安某身穿漫威电影人物“美国队长”的服装试图强闯中国驻韩大使馆,在使馆外与警方发生冲突后被捕。调查显示,安某是前总统尹锡悦的支持者。此前,他还曾冲击过首尔一…

特朗普上任以来首次会见鲍威尔 未讨论货币政策预期

隔夜股市,美股三大指数小幅收涨,道指涨0.28%,纳指涨0.39%,标普500指数涨0.4%。热门中概股多数收涨,纳斯达克中国金龙指数涨1.44%,京东涨超4%,小鹏汽车涨近4%,理想汽车涨超2%,百度、爱奇艺涨超1%。欧洲股市集体收跌,欧洲斯托克50指数收跌0.14%,德国DAX30指数收跌0.44…

【数据集】中国日尺度1 km全天候地表温度数据集(2000-2022)

目录 数据概述TRIMS LST 数据集的处理流程模块 I:原始 RTM 方法模块 II:RFSTM 方法(随机森林时空融合)模块 III:TSETR 方法(基于时间序列的重建)🛠 数据预处理数据下载参考补充说明:All-weather 的含义数据概述 论文-J2024-《TRIMS LST: a daily 1 km all-weather l…