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. semi-consistent简介

    semi-consistent简介 http://hedengcheng.com/?p=220 semi-consistent简介    1 semi-consistent实现    2 MySQL ...

  2. 001-Spring Cloud Edgware.SR3 升级最新 Finchley.SR1,spring boot 1.5.9.RELEASE 升级2.0.4.RELEASE注意问题点

    一.前提 升级前 => 升级后 Spring Boot 1.5.x => Spring Boot 2.0.4.RELEASE Spring Cloud Edgware SR3 => ...

  3. visual studio code 的必装推荐插件plugin, vscode, vsc

    An Old Hope Theme     (theme, 推荐,且推荐它的 classic theme,安装后在颜色选项里选择,该插件的定制见文末) Cobalt2     (theme) Drac ...

  4. SSM请求的响应

    1.请求响应文本到页面直接用pw.println("文本信息");打印到页面: 2.如果请求方法前不加@ResponseBody,返回字符串直接转发到对应的页面: 3.如果请求方法 ...

  5. PHP学习必读的20本书

    PHP相关<PHP程序设计>(第2版) –PHP语法和入门最好的书<PHP5权威编程> –PHP入门后升级书<深入PHP:面向对象.模式与实践>(第3版) –理解P ...

  6. weka源代码-总述

    分类: 所有的分类器都继承自抽象类AbstractClassifier而AbstractClassifier继承自接口Classifier.集成关系如下图所示: 而类Classifier中主要包含以下 ...

  7. Teleport Ultra 抓包工具

    Teleport Ultra 所能做的,不仅仅是离线浏览某个网页,它可以从 Internet 的任何地方抓回你想要的任何文件. 它可以在你指定的时间自动登录到你指定的网站下载你指定的内容,你还可以用它 ...

  8. java的时间处理

    采用joda.time库 gradle,可以简化calendar的 compile "joda-time:joda-time:2.7" 例子:http://blog.csdn.ne ...

  9. animation效果

    添加一个颜色灰渐变的动画效果. <!DOCTYPE html><html lang="en"><head> <meta charset=& ...

  10. Detour的简单使用

    Detours的安装:下载部分:1.直接在百度搜"detour",进对应的网站下载.2.或以下链接https://www.microsoft.com/en-us/research/ ...