当前位置: 首页 > java >正文

《P2324 [SCOI2005] 骑士精神》

题目描述

输入格式

第一行有一个正整数 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.xdnf.cn/news/9673.html

相关文章:

  • uniapp开发企业微信小程序时 wx.qy.login 在uniapp中使用的时候,需要导包吗?
  • TCP连接关闭过程的技术解析:从四次挥手到资源释放
  • 变频器从入门到精通
  • 【达梦数据库】临时表空间不足
  • MySQL 查询语句的执行顺序
  • 【Rust模式与匹配】Rust模式与匹配深入探索与应用实战
  • 变更数据捕获(CDC)与流处理引擎实现医疗数据实时同步(下)
  • 【C语言】函数指针及其应用
  • Python基础 | jupyter工具的安装与基本使用
  • AI 眼镜新纪元:贴片式TF卡与 SOC 芯片的黄金组合破局智能穿戴
  • 油猴脚本开发基础
  • 苹果公司计划按年份来重命名重大的软件,将升级iOS 18软件至iOS 26
  • Apache Kafka 实现原理深度解析:生产、存储与消费全流程
  • 如何将 WSL 的 Ubuntu-24.04 迁移到其他电脑
  • 【C语言极简自学笔记】项目开发——扫雷游戏
  • 【AI论文】论文转海报:迈向从科学论文到多模态海报的自动化生成
  • 【计算机网络】第2章:应用层—应用层协议原理
  • 记录一个难崩的bug
  • leetcode701.二叉搜索树中的插入操作:迭代法利用有序性寻找空节点插入点
  • 【评测】DuReader-Retrieval数据集之初体验
  • C++并集查找
  • 关于scrapy在pycharm中run可以运行,但是debug不行的问题
  • 联想小新pro 14 重新安装系统提示acpi-bios-error错误的解决方法
  • VSCode远程开发-本地SSH隧道保存即时修改
  • 三轴云台之抗扰动技术篇
  • Text-to-SQL评估体系:从Spider 1.0数据集到2.0框架的跨越与革新
  • 9.安卓逆向2-frida hook技术-frida基本使用-frida-ps指令
  • 202505系分论文《论信息系统开发方法及应用》
  • C++学习细节回顾(汇总三)
  • Linux命令行命令自动补全