hdu 2234(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2234
思路:IDA*可以搞,借鉴的是大牛的启发式函数h(): 可以考虑把每一行上的数转化成相同的,或者把每一列上的数字转化成相同的,二者取最小值。
1 1 3 2
2 4 4 2
3 3 1 4
1 2 3 4
如果把这个矩阵转化成行相同的话需要的操作:第一行 至少要2次,第二行也是2次, 第三行是2次,第四行是3次, 所以把矩阵转化成行相同至少要3次。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int map[][];
int maxdeep; bool Judge()
{
if(map[][]!=map[][]){
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(map[j][i]!=map[i][i])return false;
return true;
}else {
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(map[i][j]!=map[i][])return false;
return true;
}
} int Get_H()
{
int step1=,step2=;
for(int i=;i<=;i++){
int num[]={},ans=;
for(int j=;j<=;j++)num[map[i][j]]++;
for(int j=;j<=;j++)ans=max(ans,num[j]);
step1=max(step1,-ans);
}
for(int j=;j<=;j++){
int num[]={},ans=;
for(int i=;i<=;i++)num[map[i][j]]++;
for(int i=;i<=;i++)ans=max(ans,num[i]);
step2=max(step2,-ans);
}
return min(step1,step2);
} void Move_L(int i)
{
int tmp=map[i][];
for(int j=;j<=;j++)map[i][j-]=map[i][j];
map[i][]=tmp;
} void Move_R(int i)
{
int tmp=map[i][];
for(int j=;j>=;j--)map[i][j]=map[i][j-];
map[i][]=tmp;
} void Move_U(int j)
{
int tmp=map[][j];
for(int i=;i<=;i++)map[i-][j]=map[i][j];
map[][j]=tmp;
} void Move_D(int j)
{
int tmp=map[][j];
for(int i=;i>=;i--)map[i][j]=map[i-][j];
map[][j]=tmp;
} bool IDA_star(int deep)
{
if(deep==maxdeep)return Judge();
if(Get_H()+deep>maxdeep)return false; for(int i=;i<=;i++){
Move_L(i);
if(IDA_star(deep+))return true;
Move_R(i); Move_R(i);
if(IDA_star(deep+))return true;
Move_L(i);
}
for(int j=;j<=;j++){
Move_U(j);
if(IDA_star(deep+))return true;
Move_D(j); Move_D(j);
if(IDA_star(deep+))return true;
Move_U(j);
}
return false;
} int main()
{
int _case;
scanf("%d",&_case);
while(_case--){
for(int i=;i<=;i++)
for(int j=;j<=;j++)scanf("%d",&map[i][j]);
if(Judge()){
puts("");
continue;
}
maxdeep=;
while(maxdeep<=){
if(IDA_star())break;
maxdeep++;
}
if(maxdeep<=){
printf("%d\n",maxdeep);
}else
puts("-1");
}
return ;
}
hdu 2234(IDA*)的更多相关文章
- hdu 1667(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1667 思路:大牛说是IDA*的入门题=.=构造h()=8-max(1,2,3); max(1,2,3 ...
- HDU - 1584 IDA*
思路:裸的IDA*,估计当前状态至少需要多少距离才能达到目标状态,剪枝即可.每一墩牌只需记录其最上面和最下面的牌型即可完成移动. AC代码 #include <cstdio> #inclu ...
- HDU - 3567 IDA* + 曼哈顿距离 + 康托 [kuangbin带你飞]专题二
这题难度颇大啊,TLE一天了,测试数据组数太多了.双向广度优先搜索不能得到字典序最小的,一直WA. 思路:利用IDA*算法,当前状态到达目标状态的可能最小步数就是曼哈顿距离,用于搜索中的剪枝.下次搜索 ...
- hdu 2918(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2918 思路:这道题与前面几道类似,可以说是被秒杀了!!!构造启发式函数h()=(cnt+3)/4(cn ...
- hdu 1813(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1813 思路:首先bfs预处理出‘0’到边界点最短距离,然后构造 h() 为所’0‘点逃离迷宫的最少步数 ...
- hdu 1560(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 思路:关键是启发式函数h()的构造,我们可以这样想:每次给主串增加一个字符和字符串的最后一位比较 ...
- HDU 1560 IDA*搜索
用N个串中找到最短的公共串(不要求连续,仅仅要相对位置一样就可以) 迭代加深搜索就可以 剪枝:当前的深度+最少还有加深的深度是否大于限制的长度,若是,则退回. #include "stdio ...
- HDU 2485 Destroying the bus stations (IDA*+ BFS)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2485 题意:给你n个点,m条相连的边,问你最少去掉几个点使从1到n最小路径>=k,其中不能去掉1, ...
- HDU 1813 Escape from Tetris (IDA*)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1813 题意:给你一个n*n的迷宫,其中0代表有一个人在这个位置,1代表墙,现在要求一个路线,使所有的人通 ...
随机推荐
- java反射--动态加载
Class.forName("类的全称") 1)不仅表示类的类类型,还表示了动态加载类 2)请区分编译,运行 3)编译时刻加载类是静态加载类,运行时刻加载类是动态加载类 比如下面: ...
- Okhttp实用封装
概述 对okhttp的get,put,delete,post请求简单封装,减少了不必要的冗余代码 详细 代码下载:http://www.demodashi.com/demo/11101.html 在自 ...
- 发现恶意ip大量访问 可使用命令进行封禁
1. vim /etc/sysconfig/iptables 2.添加箭头指向的语句,ip可以替换, 3. 保存后退出 service iptables save 4.重启 service iptab ...
- Solr 搜索功能使用
http://wiki.apache.org/solr/SolrQuerySyntax http://www.solrcn.com/index.php?s=查询
- Weex Ui 是一个基于 Weex 的富交互、轻量级、高性能的移动端 UI 组件库
Github资源:https://github.com/alibaba/weex-ui 预览 你可以通过飞猪.淘宝.天猫.Weex Playground 或者浏览器扫码体验 安装 npm i weex ...
- Android异步任务处理框架AsyncTask源代码分析
[转载请注明出处:http://blog.csdn.net/feiduclear_up CSDN 废墟的树] 引言 在平时项目开发中难免会遇到异步耗时的任务(比方最常见的网络请求).遇到这样的问题.我 ...
- js ~取非运算符的妙用,将-1转为0(或假值)
典型的运用场景就是indexOf
- path方法总结
$.mobile.path.get(url);//获取URL地址的目录部分,就是除了a.html之外的那部分 jQuery.mobile.path.getDocumentBase(bool) //获取 ...
- struts2防止表单重复提交的解决方案
一.造成重复提交主要的两个原因: 在平时的开发过程中,经常可以遇到表单重复提交的问题,如做一个注册页面,如果表单重复提交,那么一个用户就会注册多次,重复提交主要由于两种原因. 1. 一是,服务器 ...
- Xcode常见问题
今天真机测试的时候,突然出现了这个错误: not have an architecture that “Administrator”的 iPhone (3) can execute. 原因是我刚刚修 ...