问题描述:在九宫格中放置8个数,有一个为空格。给定初始状态九宫格,和目标状态九宫格,问需要多少步可以将初始状态变成目标状态。如果无法达到输出-1,如果可以达到,输出最少的步骤数。

问题分析:本题属于搜索算法中的经典题目。可以用很多方法来解答,一般有A*算法和广度搜索BFS。因为广度搜索较容易理解,所以这里就用BFS来解答。

已知一个初始状态,如何利用BFS,搜索到最终状态?

如下图所示,每一次画出当前可移动之后的状态,每次移动一个方块,层数表示移动的步骤数,一旦搜索到目标状态,就停止搜索返回层数,即最少的步骤数。

这里有几个问题需要注意:

1.如何进行重复性判断? 一旦搜索到重复的状态图,表示前面已经搜索到过了,所以重复的就不需要考虑了。我是通过set集合,将每个图映射成一个整数,将其压入set集合中,当下次来一个新的整数,只要判断它是否在set集合中即可。

2.如何存储图的状态?用一个结构体node,里面保存一个char[3][3]数组和空格的位置。

3.如何表示空格周围方块的移动?其实只要更新空格的位置,再将空格位置上的原值移动到原来空格的位置即可。简而言之,就是交换两个数值的位置,只不过这里有一个值是'.'

4.另外注意,移动之后数码块的合法性检查,即是否超出了边界。

代码展示:

#include <iostream>
#include <queue>
#include <string>
#include <set>
using namespace std;#define N 10005;char mp[3][3],gp[3][3];
int dir[4][2] = {0,1,1,0,-1,0,0,-1}; //表示上下左右四个方向struct node{  //结点代表一种状态int x,y;int step;char cur_mp[3][3]; //当前图案node(int x,int y,int step){this->x = x;this->y = y;this->step = step;}
};set<int> st;
queue<node> q;bool check(node cur){ //判断是否达到终态for(int i=0;i<3;i++){for(int j=0;j<3;j++){if(cur.cur_mp[i][j]!=gp[i][j])return false;}}return true;
}int cal(node cur){  //将每种状态映射到一个整数int result = 0;for(int i=0;i<3;i++){for(int j=0;j<3;j++){if(cur.cur_mp[i][j]!='.')result = result*10+(cur.cur_mp[i][j]-'0');elseresult = result*10+9;}}return result;
}void bfs(){st.clear();if(!q.empty())st.insert(cal(q.front()));while(!q.empty()){node cur = q.front();q.pop();if(check(cur)){  //检查是否到了终态cout<<cur.step<<endl;return;}//改动空格周围的四个数码块for(int i=0;i<4;i++){int xx = cur.x + dir[i][1];int yy = cur.y + dir[i][0];if(xx<0 || xx>2 || yy<0 || yy>2)continue;    //边界检查node nt = node(xx,yy,cur.step+1);memcpy(nt.cur_mp,cur.cur_mp,sizeof(cur.cur_mp));int temp = nt.cur_mp[xx][yy];nt.cur_mp[xx][yy] = '.';nt.cur_mp[cur.x][cur.y] = temp;int val = cal(nt);if(st.find(val) != st.end()) //去掉重复的图continue;st.insert(val);q.push(nt);}}cout<<-1<<endl;
}int main(){string str1,str2;cin>>str1>>str2;int bx=0,by=0;while(!q.empty())q.pop();int len = 0;for(int i=0;i<3;i++){for(int j=0;j<3;j++){mp[i][j] = str1[len++];if(mp[i][j]=='.'){bx = i;by = j;}}}node cur = node(bx,by,0);memcpy(cur.cur_mp,mp,sizeof(mp));q.push(cur);len = 0;for(int i=0;i<3;i++){for(int j=0;j<3;j++){gp[i][j] = str2[len++];}}bfs();return 0;
}

蓝桥杯-九宫重排 (搜索)相关推荐

  1. 蓝桥杯——九宫重排、青蛙跳杯子

    1.历届试题 九宫重排   时间限制:1.0s   内存限制:256.0MB 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中 ...

  2. 蓝桥杯 九宫重排 java_九宫重排--蓝桥杯国赛历年真题

    标题:九宫重排 如图1的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片能够移动到空格中.通过若干次移动,能够造成图2所示的局面. 咱们把图1的局面记为:1234567 ...

  3. 蓝桥杯九宫重排(bfs+用set去重)

    题目连接 #define _CRT_SECURE_NO_WARNINGS #include<cstdio> #include<iostream> #include<que ...

  4. 蓝桥杯 九宫重排 java_【蓝桥杯】历届试题 九宫重排

    #include#include#include#include using namespacestd;int dir[4] = {-3, 3, -1, 1}; //x, y 上 -3 下 +3 左 ...

  5. 【算法】蓝桥杯dfs深度优先搜索之排列组合总结

    [导航] 上一篇文章 → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结>   为了重申感谢之意,再次声明下文的大部分灵感均来自于[CSDN]梅森上校<JAVA版本:DFS算法题解两 ...

  6. 【算法】蓝桥杯dfs深度优先搜索之图连通总结

    前言 上两篇文章 → <[算法]蓝桥杯dfs深度优先搜索之排列组合总结>      → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结>   为了重申感谢之意,第三次声明下文的 ...

  7. java 蓝桥杯 九宫幻方 ---ERIC-0222

    资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每 ...

  8. 2013年第四届蓝桥杯国赛试题及详解(Java本科B组)

    蓝桥杯历年真题题目及题解目录汇总 结果填空 (满分10分) 结果填空 (满分12分) 代码填空 (满分8分) 程序设计(满分17分) 程序设计(满分22分) 程序设计(满分31分) 1.标题:猜灯谜 ...

  9. 蓝桥杯---历届真题 题解

    试题编号 题解 问题描述 PREV-55 小计算器 模拟 PREV-54 合根植物 并查集 PREV-53 分考场 回溯 PREV-52 小数第n位 数学 PREV-51 观光铁路 PREV-50 对 ...

最新文章

  1. securecrt 连接配置存放目录_SecureCRT 迁移到新环境,导出配置文件目录 转(示例代码)...
  2. jquery刷新页面
  3. 计算机硬件选型报价,组装电脑硬件该怎么选择?这几个硬件要舍得花钱,千万别买错了!...
  4. 函数mkdir、mkdirat和emdir
  5. Workbox.strategies v3.x 中文版
  6. Java学习笔记7-2——注解与反射
  7. Zookeeper基础常用操作以及ACL权限
  8. Python基础学习笔记之(一)
  9. hadoop版本升级到2.4.1
  10. 竖流式沉淀池集水槽设计计算_竖流沉淀池计算书
  11. qq邮箱html模板_用了这么多简历模板,发现只有QQ邮箱自带的模板最好用
  12. Oracle RAC Failover机制分析
  13. 书------编程书(FoxPro)
  14. 图像处理农业应用sci_SCI/SSCI期刊资源(4月20日更新)
  15. JavaMail中的553 Mail from must equal authorized user
  16. 跨考计算机无法调剂,考研调剂又出新变化:“不能跨学科门类调剂”!
  17. 三个数比较大小函数调用c语言,C语言程序系列第四弹–max函数判断三个数的大小...
  18. Java 算法:带权图Weighted Graph
  19. 弗洛伊德算法(floyd)
  20. 贴片电阻有哪几类封装尺寸?

热门文章

  1. Win7系统x64正在准备再循环
  2. DataGridView添加复选框并获取选中行的值
  3. 关于QQ pc端撤回破解
  4. 【面向计算机的数理逻辑/软件理论基础笔记】一阶谓词逻辑系统的证明理论,包含演绎定理、可证等价关系和完备性定理
  5. 电子计算机将来是干什么的,电子信息工程专业将来干什么 就业前景好不好
  6. ghostwin7系统时不小心分区了的找到数据办法
  7. win11系统之win11亮点
  8. 【5G】UE开关飞行模式信令变化流程分析
  9. 雷味十足的新鲜网络俏皮话
  10. Could not find messages which ‘/home/zjj/practice/my/src/test/msg/gps.msg‘