历届试题 九宫重排 (bfs 八数码问题)
我们把第一个图的局面记为:12345678.
把第二个图的局面记为:123.46758
显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。
123.46758
46758123.
#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 八数码问题)相关推荐
- 历届试题+九宫重排+java_蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)...
Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...
- 算法笔记_183:历届试题 九宫重排(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成 ...
- 历届试题 九宫重排 广度优先搜索+康拓排序
历届试题 九宫重排 时间限制:1.0s 内存限制:256.0MB 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移 ...
- java九宫排序,蓝桥杯 历届试题 九宫重排 java
list = new ArrayList(); list.add(new Move(x1,y1,0,start));//添加初始状态进入list set.add(start);//添加初始字符串进入s ...
- 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)
Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...
- [蓝桥杯][历届试题]九宫重排-双向bfs和map标记
题目描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...
- python 九宫重排_[蓝桥杯][历届试题]九宫重排 (Python代码)(bfs+集合)
ac代码..可是官网还有两组没过.. ```python from collections import deque class Node(): def __init__(self, arr, ste ...
- 蓝桥杯 历届试题 九宫重排
问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...
- 蓝桥杯 历届试题 九宫重排
问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...
最新文章
- 使用IDEA开发Servlet程序
- [数位dp] spoj 10738 Ra-One Numbers
- Java-Runoob:Java Stream、File、IO
- abap table control里面各种属性和事件的写法
- Visual Studio 2017 15.9 版本发布:推出全新的导入 / 导出配置功能
- [gstreamer][001] Seek issues and so on
- 经典重温:《Attention Is All You Need》详解
- day32 java的多线程(4)synchronized
- Eclipse中activiti插件的安装
- 一次library cache pin故障的解决过程
- springboot + h2 + vue + AceEditor + element-ui 数据库管理系统(DMS)- JavaWeb毕业设计|课程设计
- OpenGL (太阳,地球,月亮 +太阳系八大行星)
- Python与OpenCV(二)——基于背景差分法的运动目标检测程序分析
- ps 图层解锁后变成全格子(全透明)的解决方法
- 首先下载安装data.table包_首次揭秘“超级签”与企业包行业内幕
- 3类、5类、超5类线有什么不同
- 古剑飞仙手游Linux系统服务器架设教程
- linux服务器安装laravel教程
- 小公司的“鸡头”OR大公司的“凤尾”
- XP Mod Android6,XP Mod Launcher仿XP桌面启动器的桌面软件