题目描述 Description

Yours和zero在研究A*启发式算法.拿到一道经典的A*问题,但是他们不会做,请你帮他们.
问题描述


3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:
给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的
转变。

输入描述
Input Description

输入初试状态,一行九个数字,空格用0表示

输出描述
Output Description

只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)

样例输入
Sample Input

283104765

样例输出
Sample Output

4

正解:BFS+hash

解题报告:

  向总让我写标程,然后我就愉快地开始写这道最初学搜索时的水题,然而我第一遍wa了,mdzz

  hash判重,BFS搜索

 

 #include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int MOD = ;//hash的模
char ch[];
int now;
int a[][];//记录状态
int times[];//计算移动次数
int final[]={,,,,,,,,};//目标局面
int cnt,hash[],next[],to[];//hash表 void insert(int x){//插入哈希表
int num=;
for(int i=;i<;i++) num=num*+a[x][i];
int ha=num%MOD;
next[++cnt]=hash[ha]; hash[ha]=cnt; to[cnt]=num;
} bool check(int x){//哈希判重,挂链
int num=;
for(int i=;i<;i++) num=num*+a[x][i];
int ha=num%MOD;
for(int i=hash[ha];i;i=next[i])
if(to[i]==num) return false;
return true;
} int main()
{
for(int i=;i<;i++) ch[i]=getchar();
for(int i=;i<;i++) a[][i]=ch[i]-'';
int head=,tail=; insert();
while(head<tail) {
head++;
for(int i=;i<;i++) if(a[head][i]==) { now=i; break; }//找到当前0的位置
for(int k=-;k<=;k+=) {//枚举移动的每一种可能
int to=now+k;
if(to< || to>=) continue;//越界
if(now%== && k==) continue;//在右边界上不能再向右移动一格
if(now%== && k==-) continue;//在左边界不能再向左移动一格
tail++; for(int i=;i<;i++) a[tail][i]=a[head][i];//把交换前的情况复制到新数组
swap(a[tail][now],a[tail][to]);//交换位置
if(check(tail)) {//得到一组可行解
times[tail]=times[head]+;
bool ok=true;
for(int i=;i<;i++) if(a[tail][i]!=final[i]) { ok=false; break; }
if(ok) { printf("%d",times[tail]); return ; }
insert(tail);
}
else tail--;//此状态已经重复,可以省略
}
}
return ;
}

最新文章

  1. Oracle 数据库基础学习 (八) PL/SQL综合练习
  2. scrollview 嵌套 折叠效果
  3. xml配置文件的读写
  4. 以Debug模式启动JBoss
  5. 程序设计入门—Java语言 第五周编程题 2井字棋(5分)
  6. String与Date、Timestamp互转
  7. 三星电视删除USB播放记录
  8. checkbox的问题整理
  9. Team Foundation Server 2015使用教程--默认团队成员添加
  10. php实现题目抢答、商品秒杀等类型的需求
  11. html2cavans
  12. Windows系统下的TCP参数优化(注册表\TCPIP\Parameters)
  13. JavaScript Dom级别
  14. sed命令替换字符包含斜杠\,引号的处理方法
  15. file命令与magic file【转】
  16. Dubbo(4)消费Dubbo服务
  17. c语言学习笔记---预编译
  18. Oracle 学习之exists
  19. POJ 2513 Colored Sticks(欧拉道路+字典树+并查集)
  20. 1.需要对txt存放的测试数据做去重处理,代码如下

热门文章

  1. 仙人掌(cactus)
  2. 查​看​和​设​置​o​r​a​c​l​e​数​据​库​的​最​大​连​接​数
  3. 考虑与Maya结合
  4. Xcode视图调试
  5. 在windows中,如何使用cmd命令行窗口正确显示编码为utf-8格式的文字
  6. f2fs解析(四)f2fs的extent特性
  7. 5050 [JL] 他爱上了鸭蛋
  8. Linux 进程与线程一(创建-关闭线程)
  9. sqlalchemy 的 ORM 方式使用示例
  10. 获取元素的xpath, 转换xpath为csspath进行jQuery元素获取