Problem J

八数码

时限:5000ms 内存限制:20000K 总时限:10000ms

描述:

在九宫格里放在1到8共8个数字还有一个是空格,与空格相邻的数字可以移动到空格的位置,问给定的状态最少需要几步能到达目标状态(用0表示空格):
1 2 3
4 5 6
7 8 0

输入:

输入一个给定的状态。

输出:

输出到达目标状态的最小步数。不能到达时输出-1。

输入样例:

 

1 2 3
4 0 6
7 5 8

输出样例:

 

2

来源:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<map>
#include<cmath>
using namespace std;
queue<int> q;
map<int,int> si;
int a[10],b[10];
int power(int u,int p)
{int ans=1;if(p==0) return 1;else{for(int i=1;i<=p;i++)ans*=u;}return ans;
}
int trans(int num,int flag)
{int i=8;int temp;int r,c;memset(a,0,sizeof(a));//0要重置0,因为首位可能是0,数值就没有8位,a[8]的值无法判断while(num!=0){int temp=power(10,i);a[i]=num/temp;num%=temp;i--;}for(i=8;i>=0;i--){int row=(8-i)/3;int col=(8-i)%3;if(a[i]==0){r=row;c=col;temp=i;break;}}if(flag==1){if(r>=1){a[temp]=a[temp+3];a[temp+3]=0;for(i=8;i>=0;i--)num+=a[i]*power(10,i);}}else if(flag==2){if(r<=1){a[temp]=a[temp-3];a[temp-3]=0;for(i=8;i>=0;i--)num+=a[i]*power(10,i);}}else if(flag==3){if(c>=1){a[temp]=a[temp+1];a[temp+1]=0;for(i=8;i>=0;i--)num+=a[i]*power(10,i);}}else if(flag==4){if(c<=1){a[temp]=a[temp-1];a[temp-1]=0;for(i=8;i>=0;i--)num+=a[i]*power(10,i);}}return num;
}
int numxxx;
void bfs()
{int num;int flag;int temp;while(!q.empty()){num=q.front();q.pop();if(num==123456780) { printf("%d\n",si[123456780]-1); return;}else{for(flag=1;flag<=4;flag++){temp=trans(num,flag);if(temp!=0){if(si.count(temp)==0){si[temp]=si[num]+1;q.push(temp);}}}}}printf("-1\n");
}
int main()
{int temp;int i;scanf("%d",&temp);numxxx=temp*power(10,8);for(i=7;i>=0;i--){scanf("%d",&temp);numxxx+=temp*power(10,i);}si[numxxx]=1;q.push(numxxx);bfs();
}

八数码(有一个空的移动拼图模型+map.count的用法)相关推荐

  1. 多种方法求解八数码问题

    AI的实验报告,改了改发上来.希望路过的大牛不吝赐教.非常是纳闷我的ida*怎么还没有双搜快.还有发现基于不在位启示的A*和Ida*都挺慢.尤其是ida* 搜索31步的竟然要十几秒.是我写的代码有问题 ...

  2. UVA 716(Commedia dell' arte-三维八数码)

    题意:给一个3维八数码(长宽高为 n≤100 n \le100),问能否恢复原状? 考虑2维八数码 给一个网上的结论 八数码问题的有解无解的结论: 一个状态表示成一维的形式,求除0之外所有数字的逆序数 ...

  3. python 八数码_python 处理八数码 双向BFS 拼图游戏 | 学步园

    我的代码一开始是单向的BFS 然后很慢,5分钟? 参照别人的代码后,改用双向BFS 很快 拼图问题 == 八数码问题 从开始状态start,进行BFS 同时,从结束状态end,进行BFS 如果左图能够 ...

  4. 移动拼图游戏(八数码问题) BFS版

    小时候玩过的移动拼图游戏.有一个3*3的棋盘,其中有0-8这9个数字,0表示空格,每次移动只能把空格旁边的数字移到空格,即与0相邻的数字可以和0交换位置. 求从初始状态 2 3 0 7 1 6 5 8 ...

  5. 移动拼图游戏(八数码问题)A*版

    小时候玩过的移动拼图游戏.有一个3*3的棋盘,其中有0-8这9个数字,0表示空格,每次移动只能把空格旁边的数字移到空格,即与0相邻的数字可以和0交换位置. 求从初始状态 2 3 0 7 1 6 5 8 ...

  6. [算法分析与设计]拼图问题或八数码问题(搜索算法)

    [问题分析]: 拼图游戏实际上是八数码问题的小变形或者说其实就是八数码问题,针对八数码问题我们有三种搜索算法,分别是宽度优先搜索算法,深度优先搜索算法,启发式搜索算法A*.在解决路径类问题(即在一个二 ...

  7. 小游戏系列算法之五广度优先搜索,双向广搜,八数码,华容道

    前段时间在玩仙五前,遇上了蚩尤冢拼图这个小游戏. 其实就是八数码问题,一直想着如何才能用最少步数求解,于是就写了个程序. Q1:什么是八数码问题? A1:首先假定一个3*3的棋盘(如上图),分别有1, ...

  8. 基于Python实现的AStar求解八数码问题

    资源下载地址:https://download.csdn.net/download/sheziqiong/86776612 资源下载地址:https://download.csdn.net/downl ...

  9. AI 八数码A_star算法问题-实验报告

    一 题目要求: 八数码问题的A星搜索算法实现         要求:设计估价函数,并采用c或python编程实现,以八数码为例演示A星算法的搜索过程,争取做到直观.清晰地演示算法,代码要适当加注释. ...

最新文章

  1. XML格式对象序列化(2)
  2. 用正则表达式作html2RSS服务
  3. centos下安装python2.7.1 以及装完后 yum 不能用的问题
  4. springBoot后台发送内容至邮箱
  5. 网络协议之:一定要大写的SOCKS
  6. gi如果某次提交错误,如何撤回
  7. Python基础(三)文件操作和处理json
  8. 370万开发者,14万家企业!飞桨中国行落地深圳 激发AI软硬件创新发展新动能...
  9. exchange2003客户端无法收发邮件的一次处理过程
  10. myeclipse新建JSP中DOCTYPE问题
  11. linux中nmap命令,Linux中nmap命令起什么作用呢?
  12. 算法交易的机遇和挑战
  13. 高端计算机教室,惟义楼高端智慧教室!360°高清全景抢先看
  14. 劝学篇翻译软件测试,《劝学篇》 全文、注释、翻译和赏析 - 可可诗词网
  15. java中 enum什么意思_enum在java中是什么意思
  16. Word2010专项试题
  17. AssetBundle(一)——AssetBundle介绍
  18. webview的java与js互操作
  19. php微信小程序如何无限点赞,小程序点赞收藏功能
  20. 技术/研发经理介绍和创业的一些感想

热门文章

  1. Flutter获取Android/iOS设备信息
  2. 化工原理计算机辅助设计,化工原理课程设计心得体会
  3. WPS下级标题不根据上级标题的编号改变而改变解决办法
  4. 购买的腾讯云服务器一直被ddos恶意攻击怎么解决
  5. bandit-Python代码审计工具
  6. Android问题集锦之二十 Activity has leaked window that was originall
  7. CentOS 7.2 配置Apache服务(httpd)--上篇
  8. 天河微信小程序入门《四》:融会贯通,form表单提交数据库
  9. 银联的跨行清算体系架构分析
  10. 如何恢复手机删除数据文件