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

八数码与双向广搜

image

八数码问题:

将圆圈->直线

将8只蚱蜢跳跃->1只空盘跳跃

起始状态:012345678

终止状态:087654321

当前状态->下一状态:

(1)找到当前状态 空盘位置pos

(2)下一状态 位置tx=pos+nxt[i]

(3)下一字符串=当前字符串+交换字符(cstr[pos],cstr[tx])位置

代码:

起点的step设为1,最后答案需要减1

struct node{string s;//当前字符串int stp;//步数
};
int n;
int nxt[4]={1,2,-1,-2};
string a,b;void bfs()
{queue<node> q;map<string,int> mp;string cstr,tstr;//cstr当前字符串 tstr下一个字符串 int pos,tx;//当前0的位置 下一个数的位置cstr=a;//a入队 q.push({cstr,1});mp[cstr]=1;if(a==b){cout<<0;return ;}while(!q.empty()){auto head=q.front();q.pop();cstr=head.s;for(pos=0;pos<n;++pos){//找到cstr 0的位置 if(cstr[pos]=='0') break;}for(int i=0;i<4;++i){tx=(pos+nxt[i]+n)%n; //找到下一状态 字符位置 tstr=cstr; //得到下一字符串 tstr[pos]=cstr[tx];tstr[tx]=cstr[pos];if(mp[tstr]==0){//如果没搜过 加入队列 q.push({tstr,head.stp+1});mp[tstr]=1;	if(tstr==b){cout<<head.stp+1-1;return ;}}}}
} int main()
{n=9;a="012345678";b="087654321";bfs();return 0;
} 

双向广搜:

两个方向一起进行BFS

使用条件:

无向图(保证start->end的距离=end->start的距离)

核心:

  1. 设起点是a,终点是b,从a开始正向BFS,从b开始逆向BFS,当a和b搜到同一点(状态)时,终止
  2. 两个搜索并不是同时进行,而是当前状态下,哪一个搜索的队列中所含元素少,就扩展这一队列
  3. 每次扩展,只扩一层

结构:

bfs函数+extend函数

代码:

map判重,同时也记录step

为了保持代码的一致性,这里保留了struct node结构体,实际上可以去除

struct node{string s;int stp;
};
int n,nxt[4]={1,2,-1,-2};
string a,b;
bool flag;//是否相遇 void extend(queue<node> &q,map<string,int> &m1,map<string,int> &m2)
{int pos,tx;string cstr,tstr;auto head=q.front();//队首出队 q.pop();cstr=head.s;if(m2[cstr]!=0){flag=true;cout<<m1[cstr]+m2[cstr]-2;return ;}for(pos=0;pos<n;++pos){//找到队首cstr 0的位置 if(cstr[pos]=='0') break;}for(int i=0;i<4;++i){tx=(pos+nxt[i]+n)%n;//找到下一状态 字符位置 tstr=cstr;//得到下一字符串 tstr[pos]=cstr[tx];tstr[tx]=cstr[pos];if(m1[tstr]==0){//如果没搜过 加入队列 q.push({tstr,head.stp+1});m1[tstr]=m1[cstr]+1;}if(m2[tstr]!=0){//如果另一方向搜过 相遇 flag=true;cout<<m1[tstr]+m2[tstr]-2;return ;}}}void bfs()
{queue<node> q1,q2;map<string,int> mp1,mp2;q1.push({a,0});	q2.push({b,0});mp1[a]=1; mp2[b]=1;while(!q1.empty()&&!q2.empty()){//先扩展队列小的 if(q1.size()<=q2.size()) extend(q1,mp1,mp2);else extend(q2,mp2,mp1);if(flag) break;}
} int main()
{n=9;a="012345678";b="087654321";flag=false;bfs();return 0;
}
http://www.jsqmd.com/news/426881/

相关文章:

  • GLM-4-9B-Chat-1M在金融领域的应用:财报自动分析与报告生成
  • Keil5 MDK开发STM32时,如何调用Nanbeige 4.1-3B生成调试注释
  • BGE Reranker-v2-m3实战教程:将重排序结果接入Elasticsearch插件实现混合检索增强
  • Fish-Speech-1.5算法优化实战:降低语音延迟至150ms
  • 通用GUI编程技术——什么是DPI?
  • gemma-3-12b-it部署教程:Ubuntu/CentOS/Windowns三平台兼容方案
  • Python入门实战:用CCMusic构建第一个音乐分类程序
  • PETRV2-BEV模型训练指南:从预训练权重加载到微调训练全流程
  • EVA-02模型压力测试与性能调优:应对高并发请求
  • 告别手写春联!用AI一键生成马年专属对联,效果惊艳
  • Neeshck-Z-lmage_LYX_v2优化升级:低显存显卡也能流畅运行AI绘画
  • Lychee-rerank-mm模型解析:架构设计与核心技术解读
  • 零基础入门DAMOYOLO-S:快速部署通用物体检测服务
  • 小白也能懂:Qwen3-ForcedAligner-0.6B快速上手教程
  • Wan2.1-UMT5模型轻量化:STM32嵌入式设备上的推理可行性探讨
  • Mathtype公式处理:Gemma-3-12B-IT学术文档自动化
  • 前端集成FUTURE POLICE:JavaScript实现实时语音上传与解析预览
  • EVA-01实际作品集:Qwen2.5-VL-7B图文理解在科幻艺术分析中的高精度输出
  • DeOldify与ComfyUI工作流整合:可视化图像上色方案搭建
  • Guohua Diffusion 驱动游戏美术生产:快速生成场景原画与角色立绘
  • AutoGen Studio详细步骤:Qwen3-4B-Instruct-2507模型Base URL配置与API兼容性验证
  • HUNYUAN-MT 7B翻译终端AI编程助手场景:解释错误信息与翻译代码片段
  • Z-Image-Turbo_Sugar脸部Lora性能调优:降低GPU显存占用的5个技巧
  • 实时口罩检测模型剪枝:减少参数量保持精度的技巧
  • 黑丝空姐-造相Z-Turbo实战案例:利用卷积神经网络优化图像生成质量
  • Face3D.ai Pro商业应用:数字人直播解决方案
  • Ostrakon-VL-8B新手入门:从图片上传到智能分析完整指南
  • FireRedASR-AED-L应用落地:盲文出版机构语音→无障碍文本转换
  • 基于Transformer的语义理解优化:文脉定序系统核心原理与效果展示
  • 比迪丽AI绘画模型Node.js安装及环境配置指南