八数码(有一个空的移动拼图模型+map.count的用法)
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的用法)相关推荐
- 多种方法求解八数码问题
AI的实验报告,改了改发上来.希望路过的大牛不吝赐教.非常是纳闷我的ida*怎么还没有双搜快.还有发现基于不在位启示的A*和Ida*都挺慢.尤其是ida* 搜索31步的竟然要十几秒.是我写的代码有问题 ...
- UVA 716(Commedia dell' arte-三维八数码)
题意:给一个3维八数码(长宽高为 n≤100 n \le100),问能否恢复原状? 考虑2维八数码 给一个网上的结论 八数码问题的有解无解的结论: 一个状态表示成一维的形式,求除0之外所有数字的逆序数 ...
- python 八数码_python 处理八数码 双向BFS 拼图游戏 | 学步园
我的代码一开始是单向的BFS 然后很慢,5分钟? 参照别人的代码后,改用双向BFS 很快 拼图问题 == 八数码问题 从开始状态start,进行BFS 同时,从结束状态end,进行BFS 如果左图能够 ...
- 移动拼图游戏(八数码问题) BFS版
小时候玩过的移动拼图游戏.有一个3*3的棋盘,其中有0-8这9个数字,0表示空格,每次移动只能把空格旁边的数字移到空格,即与0相邻的数字可以和0交换位置. 求从初始状态 2 3 0 7 1 6 5 8 ...
- 移动拼图游戏(八数码问题)A*版
小时候玩过的移动拼图游戏.有一个3*3的棋盘,其中有0-8这9个数字,0表示空格,每次移动只能把空格旁边的数字移到空格,即与0相邻的数字可以和0交换位置. 求从初始状态 2 3 0 7 1 6 5 8 ...
- [算法分析与设计]拼图问题或八数码问题(搜索算法)
[问题分析]: 拼图游戏实际上是八数码问题的小变形或者说其实就是八数码问题,针对八数码问题我们有三种搜索算法,分别是宽度优先搜索算法,深度优先搜索算法,启发式搜索算法A*.在解决路径类问题(即在一个二 ...
- 小游戏系列算法之五广度优先搜索,双向广搜,八数码,华容道
前段时间在玩仙五前,遇上了蚩尤冢拼图这个小游戏. 其实就是八数码问题,一直想着如何才能用最少步数求解,于是就写了个程序. Q1:什么是八数码问题? A1:首先假定一个3*3的棋盘(如上图),分别有1, ...
- 基于Python实现的AStar求解八数码问题
资源下载地址:https://download.csdn.net/download/sheziqiong/86776612 资源下载地址:https://download.csdn.net/downl ...
- AI 八数码A_star算法问题-实验报告
一 题目要求: 八数码问题的A星搜索算法实现 要求:设计估价函数,并采用c或python编程实现,以八数码为例演示A星算法的搜索过程,争取做到直观.清晰地演示算法,代码要适当加注释. ...
最新文章
- XML格式对象序列化(2)
- 用正则表达式作html2RSS服务
- centos下安装python2.7.1 以及装完后 yum 不能用的问题
- springBoot后台发送内容至邮箱
- 网络协议之:一定要大写的SOCKS
- gi如果某次提交错误,如何撤回
- Python基础(三)文件操作和处理json
- 370万开发者,14万家企业!飞桨中国行落地深圳 激发AI软硬件创新发展新动能...
- exchange2003客户端无法收发邮件的一次处理过程
- myeclipse新建JSP中DOCTYPE问题
- linux中nmap命令,Linux中nmap命令起什么作用呢?
- 算法交易的机遇和挑战
- 高端计算机教室,惟义楼高端智慧教室!360°高清全景抢先看
- 劝学篇翻译软件测试,《劝学篇》 全文、注释、翻译和赏析 - 可可诗词网
- java中 enum什么意思_enum在java中是什么意思
- Word2010专项试题
- AssetBundle(一)——AssetBundle介绍
- webview的java与js互操作
- php微信小程序如何无限点赞,小程序点赞收藏功能
- 技术/研发经理介绍和创业的一些感想