HDU-2234 无题I
为每个状态定义两个函数S和H,分别表示当前状态到列一致和行一致的目标状态的最少操作次数。
然后有了估价函数F=Min(S,H)就可以IDA*了。
#include <cstdio>
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue> #define rep(i, l, r) for(int i=l; i<=r; i++)
#define down(i, l, r) for(int i=l; i>=r; i--)
#define maxn 40320
#define MAX 1<<30 using namespace std; int t, n[][], k; inline void Up(int x) { int a; a = n[][x]; n[][x] = n[][x]; n[][x] = n[][x]; n[][x] = n[][x]; n[][x] = a; }
inline void Down(int x) { int a; a = n[][x]; n[][x] = n[][x]; n[][x] = n[][x]; n[][x] = n[][x]; n[][x] = a; }
inline void Right(int x) { int a; a = n[x][]; n[x][] = n[x][]; n[x][] = n[x][]; n[x][] = n[x][]; n[x][] = a; }
inline void Left(int x) { int a; a = n[x][]; n[x][] = n[x][]; n[x][] = n[x][]; n[x][] = n[x][]; n[x][] = a; } int S()
{
int b[], o, o2 = ;
rep(i, , )
{
rep(j, , ) b[j] = ; o = ;
rep(j, , ) b[n[j][i]]++;
rep(j, , ) o = max(o, b[j]);
o2 = max(o2, -o);
}
return o2;
} int H()
{
int b[], o, o2 = ;
rep(i, , )
{
rep(j, , ) b[j] = ; o = ;
rep(j, , ) b[n[i][j]]++;
rep(j, , ) o = max(o, b[j]);
o2 = max(o2, -o);
}
return o2;
} bool Search(int x)
{
if (x == k)
{
if (!S() || !H()) return true; else return false;
}
int now = min(S(), H()); if (now > k-x) return false;
Left(); if (min(S(), H()) <= now) if (Search(x+)) return true; Right();
Left(); if (min(S(), H()) <= now) if (Search(x+)) return true; Right();
Left(); if (min(S(), H()) <= now) if (Search(x+)) return true; Right();
Left(); if (min(S(), H()) <= now) if (Search(x+)) return true; Right();
Right(); if (min(S(), H()) <= now) if (Search(x+)) return true; Left();
Right(); if (min(S(), H()) <= now) if (Search(x+)) return true; Left();
Right(); if (min(S(), H()) <= now) if (Search(x+)) return true; Left();
Right(); if (min(S(), H()) <= now) if (Search(x+)) return true; Left();
Up(); if (min(S(), H()) <= now) if (Search(x+)) return true; Down();
Up(); if (min(S(), H()) <= now) if (Search(x+)) return true; Down();
Up(); if (min(S(), H()) <= now) if (Search(x+)) return true; Down();
Up(); if (min(S(), H()) <= now) if (Search(x+)) return true; Down();
Down(); if (min(S(), H()) <= now) if (Search(x+)) return true; Up();
Down(); if (min(S(), H()) <= now) if (Search(x+)) return true; Up();
Down(); if (min(S(), H()) <= now) if (Search(x+)) return true; Up();
Down(); if (min(S(), H()) <= now) if (Search(x+)) return true; Up();
return false;
} int main()
{
scanf("%d", &t);
while (t--)
{
rep(i, , ) rep(j, , ) scanf("%d", &n[i][j]);
k = ;
while (k <= )
if (Search()) break; else k++;
if (k == ) k = -; printf("%d\n", k);
}
return ;
}
HDU-2234 无题I的更多相关文章
- HDU 2236 无题II(二分图匹配+二分)
HDU 2236 无题II 题目链接 思路:行列仅仅能一个,想到二分图,然后二分区间长度,枚举下限.就能求出哪些边是能用的,然后建图跑二分图,假设最大匹配等于n就是符合的 代码: #include & ...
- HDU 2236 无题Ⅱ
HDU 2236 无题Ⅱ 题目大意 这是一个简单的游戏,在一个\(n*n\)的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小. solution 暴枚\(i ...
- hdu 2234(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2234 思路:IDA*可以搞,借鉴的是大牛的启发式函数h(): 可以考虑把每一行上的数转化成相同的,或者 ...
- Hdu 2236 无题II 最大匹配+二分
题目链接: pid=2236">Hdu 2236 解题思路: 将行和列理解为二分图两边的端点,给出的矩阵即为二分图中的全部边, 假设二分图能全然匹配,则说明 不同行 不同列的n个元素 ...
- HDU 1871 无题
无题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- HDU 2236 无题II 题解
题目 这是一个简单的游戏,在一个n*n的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小. 输入格式 输入一个整数\(T\)表示\(T\)组数据. 对于每组数 ...
- 【最大匹配+二分答案】HDU 2236 无题II
题目内容 这是一个简单的游戏,在一个\(n×n\)的矩阵中,找\(n\)个数使得这\(n\)个数都在不同的行和列里并且要求这\(n\)个数中的最大值和最小值的差值最小. 输入格式 输入一个整数\(T\ ...
- HDU 2236:无题II(二分搜索+二分匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=2236 题意:中文题意. 思路:先找出最大和最小值,然后二分差值,对于每一个差值从下界开始枚举判断能不能二分匹配. ...
- (二分匹配“匈牙利算法”)无题II --HDU --2236
链接: http://acm.hdu.edu.cn/showproblem.php?pid=2236 代码: #include<cstdio> #include<cstring> ...
- 无题II hdu 2236(二分枚举区间)
分析:只需要用二分找一个区间,然后不断枚举这个区间是否可以达到最大匹配,一直二分到答案为止. 代码: =============================================== ...
随机推荐
- Android中一个关于ListView的奇怪问题
今天在做项目的时候发现了一个比较奇怪的问题,是关于ListView的,即ListView的android:height属性会影响程序中ListView的getView()方法的调用次数,如果设置Lis ...
- 在linux命令行下如何访问网址
1. wget Ubuntu系统自带,会将访问的首页下载到本地 admin@iZj6c9c6vaqj1i0a9j7h78Z:~$ wget www.baidu.com --2019-04-20 17: ...
- groff - groff 文档排版系统前端
总览 (SYNOPSIS) groff [ -abehilpstvzCENRSUVXZ ] [ -wname ] [ -Wname ] [ -mname ] [ -Fdir ] [ -Idir ] [ ...
- iBatis for net 框架使用
简介:ibatis 一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目,到后面发展的版本叫MyBatis但都是指的同一个东西.最 ...
- fence_vmware_soap UnicodeEncodeError
执行如下命令 fence_vmware_soap -z -l administrator@vsphere.local -p 2wsx@QAZ -a 10.0.2.200 -o list --ssl-i ...
- python之道10
写函数,函数可以支持接收任意数字(位置传参)并将所有数据相加并返回. 答案 def func(*args): count = 0 for i in args: count += i return co ...
- SQLServer锁原理和锁的类型
1.锁的用途 为了避免同时争夺数据库资源,将数据库加锁,只有拿到钥匙的用户才能使用: 2.锁的粒度 行锁(Row)--->页锁(Page)--->区锁(Partition 8个页)---- ...
- HTML5<header>元素
HTML5<header>元素 1.header元素描述了文档的头部区域,主要用于定义内容的介绍展示区域. 2.实例: <header> <h2>heder元素描述 ...
- Nginx: ubuntu系统上如何判断是否安装了Nginx?
问题描述:ubuntu系统上,如何查看是否安装了Nginx? 解决方法:输入命令行:ps -ef | grep nginx master process后面就是Nginx的安装目录. 延伸:1. 如何 ...
- EXC_BAD_ACCESS调试
有时候,你会遇到由EXCBADACCESS造成崩溃. 这篇文件会告诉你什么是EXCBADACCESS,以及它产生的原因.我还会提供一些EXCBADACCESS错误的解决方案. 1. 什么是 EXCBA ...