UVa 1343 The Rotation Game (状态空间搜索 && IDA*)
题意:有个#字型的棋盘,2行2列,一共24个格。
如图:每个格子是1或2或3,一共8个1,8个2,8个3.
有A~H一共8种合法操作,比如A代表把A这一列向上移动一个,最上面的格会补到最下面。
求:使中心8个格子数字一致的最少步骤,要输出具体的操作步骤及最终中心区域的数字。如果有多个解,输出字典序最小的操作步骤。
分析 : 还是状态空间的搜索,对象就是一个数字序列,判断中心位置是否一样,可以看出如果使用BFS,每一层还是爆炸,所以使用IDA*,关键还是模拟操作和h函数,这里的h函数是这样定义的,可以看出每一次操作,最多给当前局面添加一个符合要求的数字,那就统计一下中心区域最多的相同数字有多少,然后如果8-h > max_depth - cur_depth的话代表最好的情况下都无法解决,剪枝。模拟操作应该就是很白痴的数组转移赋值了,代码很长,很烦,建议看看刘汝佳的代码。
#include<bits/stdc++.h> using namespace std; ]; int ans_num; ]; bool Is_ok(int *arr) { ]; ] || temp!=arr[] || temp!=arr[] || temp!=arr[] || temp!=arr[] || temp!=arr[] || temp!=arr[]) return false; return true; } inline int h(const int *now) { ]; memset(cnt, , sizeof(cnt)); cnt[now[]]++, cnt[now[]]++, cnt[now[]]++, cnt[now[]]++, cnt[now[]]++, cnt[now[]]++, cnt[now[]]++, cnt[now[]]++; ], cnt[]); ret = max(ret, cnt[]); return ret; } inline void Change(int *tmp, int one, int two, int three, int four, int five, int six, int seven) { ]; index[] = one, index[] = two, index[] = three, index[] = four, index[] = five, index[] = six; index[] = seven; int temp = tmp[one];//! ; i<; i++) tmp[index[i]] = tmp[index[i+]]; tmp[index[]] = temp; } bool DFS(int *now, int cur_depth, int max_depth, int per_dir) { - h(now) > max_depth - cur_depth) return false; if(cur_depth >= max_depth) return false;//!? ; dir<=; dir++){//! ]; ){ &&dir==) || (dir==&&per_dir==)) continue; &&dir==) || (dir==&&per_dir==)) continue; &&dir==) || (dir==&&per_dir==)) continue; &&dir==) || (dir==&&per_dir==)) continue; } ; i<; i++) tmp[i] = now[i]; int top = cur_depth; switch(dir){ : ans[top]=,,,,,,);break; : ans[top]=,,,,,,);break; : ans[top]=,,,,,,);break; : ans[top]=,,,,,,);break; : ans[top]=,,,,,,);break; : ans[top]=,,,,,,);break; : ans[top]=,,,,,,);break; : ans[top]=,,,,,,);break; } if(Is_ok(tmp)){ ans[top+] = '\0'; ans_num = tmp[]; return true; } , max_depth, dir)) return true; } return false; } int main(void) { ]) && Init[]){ ; i<=; i++){ scanf("%d", &Init[i]); } if(Is_ok(Init)){ puts("No moves needed"); printf(]); continue; } ; ){ , max_depth, )) break; max_depth++; } puts(ans); printf("%d\n", ans_num); } ; }
刘汝佳代码:
// UVa1343 The Rotation Game // Rujia Liu // This solutions uses IDA* instead of BFS described in the book, because it's shorter 8-) // It's shorter because no need for lookup tables and "automatically" lexicographically smallest solution. #include<cstdio> #include<algorithm> using namespace std; /* 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 */ // lines E~H are computed with the help of rev[] ][]={ { , , ,,,,}, // A { , , ,,,,}, // B {, , , , , , }, // C {,,,,,,}, // D }; ] = {, , , , , , , }; // reverse lines of each line // center squares ] = {, , , , , , , }; ]; ]; bool is_final() { ; i < ; i++) ]]) return false; return true; } int diff(int target) { ; ; i < ; i++) if(a[center[i]] != target) ans++; return ans; } inline int h() { ), diff()), diff()); } inline void move(int i) { ]]; ; j < ; j++) a[line[i][j]] = a[line[i][j+]]; a[line[i][]] = tmp; } bool dfs(int d, int maxd) { if(is_final()) { ans[d] = '\0'; printf("%s\n", ans); return true; } if(d + h() > maxd) return false; ; i < ; i++) { ans[d] = 'A' + i; move(i); , maxd)) return true; move(rev[i]); } return false; } int main() { ; i < ; i++) ; j < ; j++) line[i][j] = line[rev[i]][-j]; ]) == && a[]) { ; i < ; i++) scanf("%d", &a[i]); ; i < ; i++) ; if(is_final()) { printf("No moves needed\n"); } else { ; ; maxd++) , maxd)) break; } printf(]); } ; }
瞎:遇到这种看起来很烦的题目,还是没有那种敏感性去试想状态空间搜索,一来就是想着如何模拟,然后脑袋一团shit,思路根本没有,所以总结应该很重要了,提供了一个思考的方向在那里,真正应该思考的是如何去实现这道题所对应的模型,而不是乱想。
UVa 1343 The Rotation Game (状态空间搜索 && IDA*)的更多相关文章
- UVA 1343 - The Rotation Game-[IDA*迭代加深搜索]
解题思路: 这是紫书上的一道题,一开始笔者按照书上的思路采用状态空间搜索,想了很多办法优化可是仍然超时,时间消耗大的原因是主要是: 1)状态转移代价很大,一次需要向八个方向寻找: 2)哈希表更新频繁: ...
- UVA - 1343 The Rotation Game (BFS/IDA*)
题目链接 紫书例题. 首先附上我第一次bfs+剪枝TLE的版本: #include<bits/stdc++.h> using namespace std; typedef long lon ...
- UVA 1343 The Rotation Game
题意: 给出图,往A-H方向旋转,使中间8个格子数字相同.要求旋转次数最少,操作序列字典序尽量小. 分析: 用一维数组存24个方格.二维数组代表每个方向对应的7个方格.IDA*剪枝是当8-8个方格中重 ...
- UVa 11212 Editing a Book (IDA* && 状态空间搜索)
题意:你有一篇n(2≤n≤9)个自然段组成的文章,希望将它们排列成1,2,…,n.可以用Ctrl+X(剪切)和Ctrl+V(粘贴)快捷键来完成任务.每次可以剪切一段连续的自然段,粘贴时按照顺序粘贴.注 ...
- UVa 1343 旋转游戏(dfs+IDA*)
https://vjudge.net/problem/UVA-1343 题意:如图所示,一共有8个1,8个2和8个3,如何以最少的移动来使得中间8个格子都为同一个数. 思路:状态空间搜索问题. 用ID ...
- UVA - 10118Free Candies(记忆化搜索)
题目:UVA - 10118Free Candies(记忆化搜索) 题目大意:给你四堆糖果,每一个糖果都有颜色.每次你都仅仅能拿随意一堆最上面的糖果,放到自己的篮子里.假设有两个糖果颜色同样的话,就行 ...
- 7-10Editing aBook uva11212(迭代加深搜索 IDA*)
题意: 给出n( 2<=n<=9) 个乱序的数组 要求拍成升序 每次 剪切一段加上粘贴一段算一次 拍成1 2 3 4 ...n即可 求排序次数 典型的状态空间搜索问题 ...
- 埃及分数 迭代加深搜索 IDA*
迭代加深搜索 IDA* 首先枚举当前选择的分数个数上限maxd,进行迭代加深 之后进行估价,假设当前分数之和为a,目标分数为b,当前考虑分数为1/c,那么如果1/c×(maxd - d)< a ...
- UVA - 11212 Editing a Book(IDA*算法+状态空间搜索)
题意:通过剪切粘贴操作,将n个自然段组成的文章,排列成1,2,……,n.剪贴板只有一个,问需要完成多少次剪切粘贴操作可以使文章自然段有序排列. 分析: 1.IDA*搜索:maxn是dfs的层数上限,若 ...
随机推荐
- 【VS开发】【图像处理】RGB各种格式
RGB格式 RGB组合格式 名字 RGB组合格式 描述 此格式用来匹配PC图形帧缓存.每个像素占据8,16,24或32个位,他们都是组合像素格式,其意为在内存中所有像素数据都是相邻排列的.当使用这些格 ...
- easyUI关键(常见)组件详解
一.easyUI 相关介绍 1.EasyUI 是前端框架,封装大量 css和封装大量 JS 2.使用前端框架时,给标签定义class 属性,就会有样式和脚本功能了(class属性对应了相关封装过的cs ...
- 细说Python的lambda函数用法,建议收藏
细说Python的lambda函数用法,建议收藏 在Python中有两种函数,一种是def定义的函数,另一种是lambda函数,也就是大家常说的匿名函数.今天我就和大家聊聊lambda函数,在Pyth ...
- php中use关键词使用场景
php中use关键词使用场景,主要使用在函数内部使用外包得变量才使用得 1,这种函数使用不到外包变量 $messge="96net.com.cn"; $exam=function ...
- 解决sudo用户找不到环境变量的问题
出于安全方面的考虑,使用sudo执行命令将在一个最小化的环境中执行,环境变量都重置成默认状态.所以PATH这个变量不包括用户自定义设置的内容 在sudo用户的主目录里的.bashrc中添加如下内容即可 ...
- 运维DNS原理配置
Linux DNS原理简介及配置 DNS简介 DNS原理 域名解析的过程 资源记录 DNS BIND安装配置 一.简介 一般来讲域名比IP地址更加的有含义.也更容易记住,所以通常用户更习惯输入域名来访 ...
- tomcat部署项目时 报错Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 and 6 Web modules
Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 and 6 Web modules 解决方法: 找到文件 .set ...
- hadoop面试复习笔记(1)
0.Mappereduce采用的是Master/Slaves模型 1.Hadoop是一个开源软件框架,支持支持大数据集的存储和处理.Apache Hadoop是存储和处理大数据的解决方案你是因为: ( ...
- MySQL水平分表
业务表增长速度较快,单表数据较大,对表的读写有影响. 思路:化整为零,把单表拆解为多表,按指定的算法规则选择表. 好处:能大幅降低单表的数据,读写更快,同时分散了表数据, SQL语句也分散到不同的表中 ...
- JS 的 Element元素对象
在 HTML DOM 中, 元素对象代表着一个 HTML 元素. 元素对象 的 子节点可以是, 可以是元素节点,文本节点,注释节点. NodeList 对象 代表了节点列表,类似于 HTML元素的子节 ...