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

《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;
}

相关文章:

  • PhysUnits】15.2 引入P1后的减一特质(sub1.rs)
  • 大模型深度学习之双塔模型
  • python 中的接口、类 、抽象类、使用场景和用法示例
  • 捋捋wireshark
  • The 2020 ICPC Asia Yinchuan Regional Programming Contest
  • Maven-生命周期
  • 排序算法-归并排序与快速排序
  • 如何避免客户频繁更换对接人
  • ASP.NET MVC添加视图示例
  • [C]基础17.自定义类型:结构体
  • MMdetection推理保存图片和预测标签脚本
  • API网关和API管理的区别
  • C++模板类深度解析与气象领域应用指南
  • 【计算机网络】第2章:应用层—应用层协议原理
  • 机器学习-线性回归基础
  • Emacs 折腾日记(二十六)——buffer与窗口管理
  • 接口自动化测试(六)
  • Windows10家庭版添加本地安全策略(需要联网)
  • 【JavaWeb】基本概念、web服务器、Tomcat、HTTP协议
  • 彻底卸载安装的虚拟机VMware Workstation软件
  • 广州艾迪网站建设/seo研究所
  • 太原本地网站搭建公司/网站建设7个基本流程
  • 潜江做网站/教育培训机构十大排名
  • 网站建设及经营应解决好的问题/seo技巧
  • 网站404怎么做视频教程/seo核心技术排名
  • 局域网网站建设软件/新品推广活动方案