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代表墙,现在要求一个路线,使所有的人通 ...
随机推荐
- 通用的sql语句
1.插入: INSERT INTO 表名称 VALUES (值1, 值2,....) 我们也可以指定所要插入数据的列: INSERT INTO table_name (列1, 列2,...) VALU ...
- 通过LDAP验证Active Directory服务
原文地址:http://www.byywee.com/page/M0/S215/215725.html C#: using System; using System.Collections.Gener ...
- 14条最佳JS代码编写技巧
http://gaohaixian.blog.163.com/blog/static/123260105201142645458315/写任何编程代码,不同的开发者都会有不同的见解.但参考一下总是好的 ...
- Linux命令-帮助命令:help
which cd 查找cd命令的位置 which umask 查找umask命令的位置 Shell就是命令解释器,就是当你敲了一个命令,谁来把这个命令传递给内核,内核运行结束后返回一个结果,是谁把这个 ...
- Php开发工具:PhpStorm=webstorm+php+db/SQL
下载地址:https://www.jetbrains.com/zh/phpstorm/specials/phpstorm/phpstorm.html?utm_source=baidu&utm_ ...
- MVC与MVP(转)
MVC模式已经出现了几十年了,在GUI领域已经得到了广泛的应用,由于微软ASP.NET MVC Framework的出现,致使MVC一度成为.NET社区的热名话题.作为MVC的变种MVP模式,也已经出 ...
- 初始化列表(const和引用成员)、拷贝构造函数
一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一).对象成员及其初始化 C++ Code 1 2 3 4 5 6 7 8 9 1 ...
- 字符编解码的故事(ASCII,GBK,Unicode,Utf-8区别)
很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们认为8个开关状态作为原子单位很好,于是他们把这称为"字节". 再后来,他们又做了一 ...
- ocr 识别 github 源码
参考 [1] https://github.com/eragonruan/text-detection-ctpn [2] https://github.com/senlinuc/caffe_ocr [ ...
- Qt 积累
总结(-) 1> 定时器的使用 QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(u ...