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

青蛙跳杯子(BFS)

#include <iostream>
#include <queue>
#include <string>
#include <unordered_set>
using namespace std;

int main() {
    string a, b;
    cin >> a >> b; 
    int n = a.size();  // 字符串长度
    int d[] = {1, -1, -2, 2, -3, 3};  // 跳跃距离
    
    queue<pair<string, int>> q;  // 队列存储状态和步数
    unordered_set<string> v;  // 记录访问过的状态
    
    q.push({a, 0});  // 初始状态入队,步数为0
    v.insert(a);     // 标记初始状态已访问
    
    while (q.size()) {
        auto [cur, step] = q.front();  // 取出当前状态和步数
        q.pop();
        int x = cur.find('*');  // 找到空杯子位置
        
        // 尝试六种跳跃
        for (int i = 0; i < 6; i++) {
            int nx = x + d[i];  // 计算新位置
            if (nx >= 0 && nx < n) {  // 检查边界
                string nt = cur;  // 创建新状态
                swap(nt[x], nt[nx]);  // 执行跳跃
                
                if (nt == b) {  // 达到目标
                    cout << step + 1;  // 输出步数
                    return 0;
                }
                if (v.find(nt) == v.end()) {  // 未访问
                    q.push({nt, step + 1});  // 新状态入队
                    v.insert(nt);  // 标记为已访问
                }
            }
        }
    }
    
    return 0; 
}

unordered_set:用于去重已访问状态。

cur.find('*'):返回字符串 cur 中 '*' 的索引。

string nt = cur:复制当前状态,避免修改 cur。

swap(nt[x], nt[nx]):交换 '*' 和目标位置的字符,模拟青蛙跳到空杯子。

if (nt == b)

  • 如果新状态匹配目标状态,输出当前步数加 1(跳跃一步),退出程序。

if (v.find(nt) == v.end())

  • 检查 nt 是否在集合 v 中未出现(未访问)。
  • find 返回迭代器,若等于 end(),表示未找到。

v 记录所有已访问的状态,例如:v = {"*WWBB", "W*WBB"}。

实例:

初始

  • a = "*WWBB", b = "WW*BB", n = 5
  • q = {{"*WWBB", 0}}, v = {"*WWBB"}

第一步

  • cur = "*WWBB", step = 0, x = 0
  • 尝试:
    • nx = 1:nt = "W*WBB", 未匹配,入队 {{"W*WBB", 1}}, v = {"*WWBB", "W*WBB"}
    • nx = -1:越界
    • nx = -2:越界
    • nx = 2:nt = "WW*BB", 匹配目标,输出 1, 退出

相关文章:

  • 如何将hf-mirror.com作为vllm默认的下载源? conda如何移除虚拟环境?conda 如何复制一份虚拟环境?
  • 15-YOLOV8OBB损失函数详解
  • Spring(三)容器-注入
  • 玩转大模型——Trae AI IDE国内版使用教程
  • 【我的Android进阶之旅】如何使用NanoHttpd在Android端快速部署一个HTTP服务器?
  • GPU、NPU与LPU:大语言模型(LLM)硬件加速器全面对比分析
  • 20241130 RocketMQ本机安装与SpringBoot整合
  • CSS2.1基础学习
  • STM32——DMA详解
  • 似然函数与极大似然估计
  • 表达式求值(后缀表达式)
  • 软考中级-数据库-3.2 数据结构-数组和矩阵
  • Deepgram推出Nova-3 Medical,AI语音转录助力医疗行业
  • 基于CURL命令封装的JAVA通用HTTP工具
  • Linux中shell对话框(dialog)编程
  • 从零开始学习Slam--数学概念
  • 文心4.5,大模型下半场的野心之作
  • 网络学习(四)HTTPS中,SSL的单向认证与双向认证
  • [自然语言处理]pytorch概述--什么是张量(Tensor)和基本操作
  • Sourcetrail 代码分析工具
  • 建筑设计规范网站/互联网培训机构排名前十
  • 建设工程资料下载网站/新闻最近的大事10件
  • 电子商务网站建设包括哪些内容/站长工具站长之家
  • 免费的app制作软件/上海关键词优化排名软件
  • 做响应式网站代码/青岛百度推广seo价格
  • 彩票网站模版/重庆seo主管