https://vjudge.net/problem/UVA-1343

题意:如图所示,一共有8个1,8个2和8个3,如何以最少的移动来使得中间8个格子都为同一个数。

思路:状态空间搜索问题。

用IDA*算法的话会比较快,而且代码比较简洁。

IDA*的关键就是要寻找一个估价函数h(),在这道题目中,每次移动最多只会使一个格子的数字正确,所以当maxd-d<h()时便可以剪枝。

 #include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std; int position[][] = {
{ , , , , , , }, { , , , , , , }, //八个方向格子的坐标值
{ , , , , , , }, { , , , , , , },
{, , , , , , }, { , , , , , , },
{, , , , , , }, { , , , , , , }
}; int goal[] = { , , , , , , , }; //目标状态的坐标 int a[];
char order[]; //记录路径 bool is_goal() //判断是否已达到目标状态
{
for (int i = ; i < ; i++)
{
if (a[goal[i]]!=a[goal[i + ]]) return false;
}
return true;
} int h() //算出不匹配的最小值
{
int n1 = , n2 = , n3 = ;
for (int i = ; i < ; i++)
{
if (a[goal[i]] == ) n1++;
else if (a[goal[i]] == ) n2++;
else if (a[goal[i]] == ) n3++;
}
return -max( max(n1, n2),n3);
} void rotate(int k) //往指定的方向移动
{
int temp = a[position[k][]];
for (int i = ; i < ; i++)
{
a[position[k][i-]] = a[position[k][i]];
}
a[position[k][]] = temp;
} bool dfs(int d, int maxd)
{
if (is_goal()) return true;
if (maxd - d < h()) return false; //剪枝
int old[]; //用来保存原来的序列
memcpy(old, a, sizeof(a));
for (int i = ; i < ; i++)
{
rotate(i); //往第i个方向移动
order[d] = i + 'A';
if (dfs(d + , maxd)) return true;
memcpy(a, old, sizeof(old)); //如果失败,则恢复原来序列
}
return false;
} void solve()
{
if (is_goal())
{
cout << "No moves needed" << endl << a[] << endl;
return;
}
for (int maxd = ;; maxd++)
{
if (dfs(, maxd))
{
order[maxd] = '\0';
cout << order << endl << a[] << endl;
return;
}
}
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
while (cin >> a[] && a[])
{
for (int i = ; i < ; i++)
cin >> a[i];
solve();
}
return ;
}

UVa 1343 旋转游戏(dfs+IDA*)的更多相关文章

  1. UVA - 11853 Paintball(dfs)

    UVA - 11853 思路:dfs,从最上面超过上边界的圆开始搜索,看能不能搜到最下面超过下边界的圆. 代码: #include<bits/stdc++.h> using namespa ...

  2. UVA.548 Tree(二叉树 DFS)

    UVA.548 Tree(二叉树 DFS) 题意分析 给出一棵树的中序遍历和后序遍历,从所有叶子节点中找到一个使得其到根节点的权值最小.若有多个,输出叶子节点本身权值小的那个节点. 先递归建树,然后D ...

  3. UVA_Rotation Game<旋转游戏> UVA 1343

    The rotation game uses a # shaped board, which can hold 24 pieces of square blocks (see Fig.1). The ...

  4. UVa 1374 快速幂计算(dfs+IDA*)

    https://vjudge.net/problem/UVA-1374 题意:给出n,计算最少需要几次能让x成为x^n(x和已经生成的数相乘或相除). 思路:IDA*算法. 如果当前数组中最大的数乘以 ...

  5. UVa 11212 编辑书稿(dfs+IDA*)

    https://vjudge.net/problem/UVA-11212 题意:给出n个自然段组成的文章,将他们排列成1,2...,n.每次只能剪切一段连续的自然段,粘贴时按照顺序粘贴. 思路:状态空 ...

  6. UVA - 1343 The Rotation Game (BFS/IDA*)

    题目链接 紫书例题. 首先附上我第一次bfs+剪枝TLE的版本: #include<bits/stdc++.h> using namespace std; typedef long lon ...

  7. UVa 1343 The Rotation Game (状态空间搜索 && IDA*)

    题意:有个#字型的棋盘,2行2列,一共24个格. 如图:每个格子是1或2或3,一共8个1,8个2,8个3. 有A~H一共8种合法操作,比如A代表把A这一列向上移动一个,最上面的格会补到最下面. 求:使 ...

  8. UVA 1343 The Rotation Game

    题意: 给出图,往A-H方向旋转,使中间8个格子数字相同.要求旋转次数最少,操作序列字典序尽量小. 分析: 用一维数组存24个方格.二维数组代表每个方向对应的7个方格.IDA*剪枝是当8-8个方格中重 ...

  9. 洛谷 P4205 [NOI2005]智慧珠游戏 DFS

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P4205 [NOI2005]智慧珠游戏 题目描述 智慧 ...

随机推荐

  1. hdu1166敌兵布阵&&hdu1754I Hate It(线段树入门)

    单点更新是最最基础的线段树,只更新叶子节点,然后把信息用pushup这个函数更新上来. http://acm.hdu.edu.cn/showproblem.php?pid=1166 update单点更 ...

  2. siblings()

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. loadrunner怎么打印接口返回的参数

    //首先使用web_reg_save_param方法保存服务器返回的参数,如下: web_reg_save_param ("S_respond","LB=",& ...

  4. Java的jdk1.6与jre1.8中存在的差异

    一般来说: jdk每一个版本都是向后兼容的,说以低版本的代码是可以运行在高版本的虚拟机上的.而反过来则不可以,用1.6的编译器编辑的字节码文件是不可以运行在1.5版本的虚拟机上的. 但是今天我用Sun ...

  5. UVM中的sequence使用(一)

    UVM中Driver,transaction,sequence,sequencer之间的关系. UVM将原来在Driver中的数据定义部分,单独拿出来成为Transaction,主要完成数据的rand ...

  6. [转]使用C#开发ActiveX控件全攻略

    前言: 这段时间因为工作的需要,研究了一下ActiveX控件.总结如下: 先说说ActiveX的基本概念. 根据微软权威的软件开发指南MSDN(Microsoft Developer Network) ...

  7. 百度云盘-真实地址 F12 控制台

    $.ajax({ type: "POST", url: "/api/sharedownload?sign="+yunData.SIGN+"&t ...

  8. appium自动化测试实战

    一.Appium的介绍   Appium是一款开源的自动化测试工具,其支持iOS和安卓平台上的原生的,基于移动浏览器的,混合的应用. 1. 使用appium进行自动化测试的好处 Appium在不同平台 ...

  9. 怎么归档老日志的shell脚本

    本脚本来自有学习阿铭的博文学习:工作中,需要用到日志切割logrotate,按照各自的需要切割.定义保留日志.提示:本文中的S全部都$符,不要问为什么,马云爸爸的社区就这样. #用途:日志切割归档.按 ...

  10. 干货:Java并发编程必懂知识点解析

    本文大纲 并发编程三要素 原子性 原子,即一个不可再被分割的颗粒.在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败. 有序性 程序执行的顺序按照代码的先后顺序执行.(处理器可能会 ...