UVa 1343 旋转游戏(dfs+IDA*)

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*)的更多相关文章
- UVA - 11853 Paintball(dfs)
UVA - 11853 思路:dfs,从最上面超过上边界的圆开始搜索,看能不能搜到最下面超过下边界的圆. 代码: #include<bits/stdc++.h> using namespa ...
- UVA.548 Tree(二叉树 DFS)
UVA.548 Tree(二叉树 DFS) 题意分析 给出一棵树的中序遍历和后序遍历,从所有叶子节点中找到一个使得其到根节点的权值最小.若有多个,输出叶子节点本身权值小的那个节点. 先递归建树,然后D ...
- UVA_Rotation Game<旋转游戏> UVA 1343
The rotation game uses a # shaped board, which can hold 24 pieces of square blocks (see Fig.1). The ...
- UVa 1374 快速幂计算(dfs+IDA*)
https://vjudge.net/problem/UVA-1374 题意:给出n,计算最少需要几次能让x成为x^n(x和已经生成的数相乘或相除). 思路:IDA*算法. 如果当前数组中最大的数乘以 ...
- UVa 11212 编辑书稿(dfs+IDA*)
https://vjudge.net/problem/UVA-11212 题意:给出n个自然段组成的文章,将他们排列成1,2...,n.每次只能剪切一段连续的自然段,粘贴时按照顺序粘贴. 思路:状态空 ...
- UVA - 1343 The Rotation Game (BFS/IDA*)
题目链接 紫书例题. 首先附上我第一次bfs+剪枝TLE的版本: #include<bits/stdc++.h> using namespace std; typedef long lon ...
- UVa 1343 The Rotation Game (状态空间搜索 && IDA*)
题意:有个#字型的棋盘,2行2列,一共24个格. 如图:每个格子是1或2或3,一共8个1,8个2,8个3. 有A~H一共8种合法操作,比如A代表把A这一列向上移动一个,最上面的格会补到最下面. 求:使 ...
- UVA 1343 The Rotation Game
题意: 给出图,往A-H方向旋转,使中间8个格子数字相同.要求旋转次数最少,操作序列字典序尽量小. 分析: 用一维数组存24个方格.二维数组代表每个方向对应的7个方格.IDA*剪枝是当8-8个方格中重 ...
- 洛谷 P4205 [NOI2005]智慧珠游戏 DFS
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P4205 [NOI2005]智慧珠游戏 题目描述 智慧 ...
随机推荐
- node.js 开发桌面程序, 10个令人惊讶的NodeJS开源项目
用 node-webkit 开源框架. 做企业站,杠杠地 包括电子书和支付宝系统都是node开发的,. 接收传感器发送的数据再运算...对水泵.风机.空调这些硬件进行远程控制. 细数10个令人惊讶的N ...
- 万恶之源 - Python运算符与编码
格式化输出 现在有个需要我们录入我们身边好友的信息,格式如下: ------------ info of Alex Li ---------- Name : Alex Li Age : 22 job ...
- nginx 11个处理阶段 && nginx lua 8个处理阶段
1. nginx 11 个处理阶段 nginx实际把请求处理流程划分为了11个阶段,这样划分的原因是将请求的执行逻辑细分,各阶段按照处理时机定义了清晰的执行语义,开发者可以很容易分辨自己需要开发的模块 ...
- Python安装sqlite3
今天使用PYthon时,发现错误 ImportError: No module named sqlite 这是因为缺少 SQLITE3的缘故. 下面分享一下解决此问题的方法步骤: 1. 查看是Pyth ...
- poj2524(简单并查集)
#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>u ...
- HDU 5059 Help him(简单模拟题)
http://acm.hdu.edu.cn/showproblem.php?pid=5059 题目大意: 给定一个字符串,如果这个字符串是一个整数,并且这个整数在[a,b]的范围之内(包括a,b),那 ...
- python爬虫对于gb2312
对于刚刚接触python爬虫的人,常常会碰到一个比较烦的问题, 如果网页是GB2312编码格式,我们直接decode(’GB2312‘)一般python都会报错: GB2312不能编码该页面. 这就比 ...
- memecached常用命令
memcached 常用命令及使用说明 1.启动Memcache 常用参数 -p <num> 设置TCP端口号(默认设置为: 11211) -U <num> UDP监听端口(默 ...
- 持续集成之二:搭建SVN服务器(subversion)
安装环境 Red Hat Enterprise Linux Server release 7.3 (Maipo) jdk1.7.0_80 subversion-1.10.3.tar.gz apr-1. ...
- python getatime() 查看文件的访问时间
import time,os def main(): file_name=r'C:\Temp\Req.xml' file_times_access=time.localtime(os.path.get ...