八数码 详解(C++)
题目描述:
在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。
输入格式:
输入初试状态,一行九个数字,空格用0表示
输出格式:
只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)
限制:
空间限制:256MByte 时间限制:1秒
样例:
输入:283104765
输出:4
一切尽在代码掌控之中:
#include<iostream>
using namespace std;
int ans[5][5]= {{0,0,0,0},{0,1,2,3},{0,8,0,4},{0,7,6,5}};
int cu[5][5],l,flag=0,xx,yy;
char s[15];
int o[5][4]= {{1,0},{0,-1},{0,1},{-1,0}};
bool ch() {for(int i=1; i<=3; i++)for(int j=1; j<=3; j++)if(ans[i][j]!=cu[i][j])return 0;return 1;
}
bool r(int step) {int cn=0;for(int i=1; i<=3; i++)for(int j=1; j<=3; j++)if(ans[i][j]!=cu[i][j])if(++cn+step>l)return 0;return 1;
}
void dfs(int num,int x,int y,int p) {if(num==l) {if(ch())flag=1;return;}if(flag)return;for(int i=0; i<4; i++) {int tx=x+o[i][0];int ty=y+o[i][1];if(tx<1||ty<1||ty>3||tx>3||p+i==3)continue;swap(cu[x][y],cu[tx][ty]);if(!flag&&r(num))dfs(num+1,tx,ty,i);swap(cu[tx][ty],cu[x][y]);}
}
int main() {scanf("%s",s);for(int i=0; i<9; i++) {cu[i/3+1][i%3+1]=s[i]-'0';if(s[i]-'0'==0)xx=i/3+1,yy=i%3+1;}if(ch())printf("0\n");else {while(++l) {dfs(0,xx,yy,-1);if(flag) {printf("%d\n",l);break;}}}return 0;
}
八数码 详解(C++)相关推荐
- Android自定义控件系列八:详解onMeasure()(二)--利用onMeasure测量来实现图片拉伸永不变形,解决屏幕适配问题
上一篇文章详细讲解了一下onMeasure/measure方法在Android自定义控件时的原理和作用,参看博文:Android自定义控件系列七:详解onMeasure()方法中如何测量一个控件尺寸( ...
- 面试必备系列JUC(6)--八锁详解
文章目录 前言 一.锁总述 二.乐观锁 VS 悲观锁 2.1 基本概念 2.2 实现方式 2.3 优缺点和适应场景 三.公平锁 VS 非公平锁 3.1 基本概念 3.2 源码解析 四.可重入锁 VS ...
- 数据结构 | 十大排序超硬核八万字详解【附动图演示、算法复杂度性能分析】
写在前面 2023年的第一篇博客,在这里先祝大家兔年快乐
- 绝境求生(八数码有解无解的问题,求逆序)
问题 E: [排序]绝境求生 时间限制: 1 Sec 内存限制: 64 MB 提交: 19 解决: 12 题目描述 The Eight Puzzle, among other sliding-ti ...
- C++解题报告:详解经典搜索难题——八数码问题( 双向BFS A* 求解)
引言 AC这道八数码问题,你和楼教主就是兄弟了... 题目描述 在一个3*3的九宫格棋盘里,放有8个数码,数码的数字分别是1~8.棋盘中还有一个位置是空着的,用0表示.可以通过在九宫格里平移数码来改变 ...
- 【×××系列八】Dynamic Multipoint *** for IPv6 详解
[×××系列八]Dynamic Multipoint *** for IPv6 详解 一.前言 由于涉及IPV6加密,所以根据思科标准此次配置使用思科7200系列高级企业版IOS (详情参考我的上一篇 ...
- linux中的shell有printf吗,Linux Shell系列教程之(八)Shell printf命令详解
在上一篇:Linux Shell系列教程之(七)Shell输出这篇文章中,已经对Shell printf命令有了一个简略的介绍,本篇给大家详细介绍下Shell中的printf命令. 一.Shell p ...
- GridControl详解(八)菜单
GridControl详解(八)菜单 菜单控件 拖入窗口中 显示如下 设置popupMenu 设置barManager 设置controller 增加菜单项 弹出配置窗口 一般菜单项设置 对应属性如下 ...
- [Python从零到壹] 八.数据库之MySQL和Sqlite基础知识及操作万字详解
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- 大数据WEB阶段(八)Tomcat服务器安装与详解、HTTP协议详解
Tomcat 一. 服务器 动态web资源运行需要服务器环境 客户端发送请求到服务器 , 服务器调用动态web资源 Servlet容器 . web容器 .服务器 Servlet容器 java中的动态资 ...
最新文章
- 镁光ssd管理工具 linux,在 SSD 上使用 Btrfs 文件系统的相关优化
- ios uiview 如何刷新_UIView的重绘及布局刷新
- 慢连接 java_记一次redis的java客户端lettuce操作慢的解决方案
- “校内”,网进去了谁?
- PHP 实现中文截取无乱码的方法
- 吴恩达DeepLearningCourse4-卷积神经网络
- 2017计算机三级哪个好考,快速突破2017年计算机三级考试的几大复习阶段
- php通过url传递变量,PHP:如何在模态URL中放置和传递变量
- CC++中的qsort库函数
- 多媒体分析与理解_如何设计一个出色的数字多媒体展厅?
- 部门管理系统_什么是实物资产管理系统?优势有哪些?
- 设计干货栅格系统素材 | UI设计师应用好帮手
- python的标准库学习之__buitin__
- 从你的全世界路过-人到难处需放胆
- 抖音上python有用吗_专栏 | 如何在抖音上找到漂亮小姐姐?这里有个Python抖音机器人...
- VTD的官方help翻译-ROD部分(5~9章)
- C++常用的大小写转换的方法
- Python 黑板客爬虫闯关的第一关
- 打砖块 java_java实现打砖块小游戏
- 龙蜥社区第十次运营委员会议顺利召开!