问题描述
如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成第二个图所示的局面。

  我们把第一个图的局面记为:12345678.
  把第二个图的局面记为:123.46758
  显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
  本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。
输入格式
输入第一行包含九宫的初态,第二行包含九宫的终态。
输出格式
输出最少的步数,如果不存在方案,则输出-1。
样例输入
12345678.
123.46758
样例输出
3
样例输入
13524678.
46758123.
样例输出
22
这题困扰我很久 网站找了些八数码的代码看看,什么哈希太深奥了,看不懂阿,后来找到了一段比较好理解的
代码:
#include "iostream"
#include "algorithm"
#include "vector"
#include "set"
#include "string.h"
#include "ctype.h"
#define M 1000000
using namespace std;typedef int type[9];
type qs[M];
type mb;
int front,rear;
int dir[4][2]={-1,0,0,-1,0,1,1,0};
int dis[M]={0};
set<int> vis; //容器,存储不同的值
int panchong(int x)
{int i,sum=0;for (i=0; i<9; i++){sum = sum*10+qs[x][i];}if (vis.count(sum)) //容器中有相同 {return 0;}vis.insert(sum);//插入容器 return 1;
}
int bfs()
{front = 1;rear = 2;int i,j,k=0,c,x,y,xx,yy;while (front < rear){type &s = qs[front]; //s指向qs[front] if (memcmp(s,mb,sizeof(mb)) == 0){return front;}for (k=0; k<9; k++){if (s[k]==0)break;}x = k/3;y = k%3; // 转成二维数组for (i=0; i<4; i++){xx = x+dir[i][0];yy = y+dir[i][1];if(xx>=0 && xx<3 && yy>=0 && yy<3){type &t = qs[rear];//t指向qs[rear] memcpy(t,s,sizeof(s));t[k] = s[xx*3+yy]; //交换空格与数字位置 t[xx*3+yy] = s[k];if (panchong(rear))//得到新的图进行判断重复 {dis[rear] = dis[front]+1;rear++;}}}front++;}return -1;
}
int main()
{int i,j,cnt;char ch[10],ch2[10];scanf("%s%s",ch,ch2); for (i=0; i<9; i++){ch[i]<='8'&&ch[i]>='0' ? qs[1][i]=ch[i]-'0' : qs[1][i]=0; }for (i=0; i<9; i++){ ch2[i]<='8'&&ch2[i]>='0' ? mb[i]=ch2[i]-'0' : mb[i]=0;} cnt = bfs();if(cnt>0){cout<<dis[cnt]<<endl;} else{cout<<-1<<endl;}return 0;
}

历届试题 九宫重排 (bfs 八数码问题)相关推荐

  1. 历届试题+九宫重排+java_蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)...

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

  2. 算法笔记_183:历届试题 九宫重排(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成 ...

  3. 历届试题 九宫重排 广度优先搜索+康拓排序

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

  4. java九宫排序,蓝桥杯 历届试题 九宫重排 java

    list = new ArrayList(); list.add(new Move(x1,y1,0,start));//添加初始状态进入list set.add(start);//添加初始字符串进入s ...

  5. 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

  6. [蓝桥杯][历届试题]九宫重排-双向bfs和map标记

    题目描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...

  7. python 九宫重排_[蓝桥杯][历届试题]九宫重排 (Python代码)(bfs+集合)

    ac代码..可是官网还有两组没过.. ```python from collections import deque class Node(): def __init__(self, arr, ste ...

  8. 蓝桥杯 历届试题 九宫重排

    问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...

  9. 蓝桥杯 历届试题 九宫重排

    问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...

最新文章

  1. 使用IDEA开发Servlet程序
  2. [数位dp] spoj 10738 Ra-One Numbers
  3. Java-Runoob:Java Stream、File、IO
  4. abap table control里面各种属性和事件的写法
  5. Visual Studio 2017 15.9 版本发布:推出全新的导入 / 导出配置功能
  6. [gstreamer][001] Seek issues and so on
  7. 经典重温:《Attention Is All You Need》详解
  8. day32 java的多线程(4)synchronized
  9. Eclipse中activiti插件的安装
  10. 一次library cache pin故障的解决过程
  11. springboot + h2 + vue + AceEditor + element-ui 数据库管理系统(DMS)- JavaWeb毕业设计|课程设计
  12. OpenGL (太阳,地球,月亮 +太阳系八大行星)
  13. Python与OpenCV(二)——基于背景差分法的运动目标检测程序分析
  14. ps 图层解锁后变成全格子(全透明)的解决方法
  15. 首先下载安装data.table包_首次揭秘“超级签”与企业包行业内幕
  16. 3类、5类、超5类线有什么不同
  17. 古剑飞仙手游Linux系统服务器架设教程
  18. linux服务器安装laravel教程
  19. 小公司的“鸡头”OR大公司的“凤尾”
  20. XP Mod Android6,XP Mod Launcher仿XP桌面启动器的桌面软件

热门文章

  1. ps如何切html用的图片,前端实战(一)-----用ps把PSD切成HTML能用的图片
  2. Adobe photo shop 裁剪某个图层中图片的大小
  3. 学java双十一电脑推荐_双十一,有什么值得学生购买的电脑吗?
  4. 卧槽,泪目了!二哥被读者的深情告白了感动哭了!!!!
  5. 市场对计算机应用技术的需求,计算机应用技术专业人才需求调研分析
  6. H3C CAS 5.0 虚拟机备份与还原
  7. 关于iOS自定义推送消息铃声
  8. 【自然语言处理】BERT 讲解
  9. 微信公众号图文中怎么下载封面图?
  10. 【sass】Sass教程