hdu6341 /// 模拟 DFS+剪枝
题目大意:
将16行16列的矩阵分成四行四列共16块
矩阵的初始状态每行及每列都不会出现重复的元素
给定一个已旋转过某些块的矩阵 判断其是由初始状态最少经过几次旋转得到的
DFS枚举16个块的旋转方式
DFS过程中直接进行旋转 一旦发现旋转结果与之前枚举的块的旋转结果相悖就剪枝
这个剪枝已经足够AC 也不妨在加一条当前旋转次数比之前得到的可能答案大就剪枝
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define mem(i,j) memset(i,j,sizeof(i))
const int N=1e5+;
const int MOD=1e9+; int G[][], g[][];
int R[][], C[][];
int ans; #define w(i) (i-1)*4
#define wG(i,j,I,J) G[w(i)+I][w(j)+J]
int get(int r,int c,int x,int y,int k) {
if(k==) return wG(r,c,-y+,x);
else if(k==) return wG(r,c,-x+,-y+);
else if(k==) return wG(r,c,y,-x+);
else return wG(r,c,x,y);
}
// 得到在r,c的块内x,y位置在第k种旋转之后的新数值 bool Rotate(int i,int j,int k) {
bool OK=;
for(int I=;I<=;I++)
for(int J=;J<=;J++) {
int x=w(i)+I, y=w(j)+J;
g[x][y]=get(i,j,I,J,k);
int r=++R[x][g[x][y]];
int c=++C[y][g[x][y]];
if(r> || c>) OK=;
// 这种旋转与之前其他块的旋转冲突
// 继续发展下去得到的一定是错误的
}
return OK;
} // 旋转i,j块 方式为第k种
void reRotate(int i,int j) {
for(int I=;I<=;I++)
for(int J=;J<=;J++) {
int x=w(i)+I, y=w(j)+J;
--R[x][g[x][y]];
--C[y][g[x][y]];
g[x][y]=G[x][y];
}
} // 将i,j块的旋转取消 void dfs(int x,int y,int sum) {
if(sum>ans) return;
if(x==) {
ans=min(ans,sum);
return;
} // 四行四列16个块 到第五行说明已枚举了所有块的旋转 for(int i=;i<=;i++) {
if(Rotate(x,y,i)==) {
reRotate(x,y); continue;
} // 若发现这种旋转方式会冲突就跳过
if(y==) dfs(x+,,sum+i);
else dfs(x,y+,sum+i);
reRotate(x,y);
}
} // 搜索枚举16个块的旋转方式 int main()
{
int t; scanf("%d",&t);
while(t--) {
for(int i=;i<=;i++) {
char s[]; scanf("%s",s);
for(int j=;j<;j++) {
if(s[j]>='' && s[j]<='')
G[i][j+]=s[j]-'';
else G[i][j+]=s[j]-'A'+;
}
} mem(R,); mem(C,);
ans=INF; dfs(,,);
printf("%d\n",ans);
} return ;
}
hdu6341 /// 模拟 DFS+剪枝的更多相关文章
- *HDU1455 DFS剪枝
Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- POJ 3009 DFS+剪枝
POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...
- poj 1724:ROADS(DFS + 剪枝)
ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10777 Accepted: 3961 Descriptio ...
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
- DFS+剪枝 HDOJ 5323 Solve this interesting problem
题目传送门 /* 题意:告诉一个区间[L,R],问根节点的n是多少 DFS+剪枝:父亲节点有四种情况:[l, r + len],[l, r + len - 1],[l - len, r],[l - l ...
- UVALive 3486/zoj 2615 Cells(栈模拟dfs)
这道题在LA是挂掉了,不过还好,zoj上也有这道题. 题意:好大一颗树,询问父子关系..考虑最坏的情况,30w层,2000w个点,询问100w次,貌似连dfs一遍都会TLE. 安心啦,这肯定是一道正常 ...
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))
Equation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- LA 6476 Outpost Navigation (DFS+剪枝)
题目链接 Solution DFS+剪枝 对于一个走过点k,如果有必要再走一次,那么一定是走过k后在k点的最大弹药数增加了.否则一定没有必要再走. 记录经过每个点的最大弹药数,对dfs进行剪枝. #i ...
随机推荐
- js实现页面跳转的几种方法小结
地址:https://www.jb51.net/article/84335.htm 地址:https://blog.csdn.net/tsoteo/article/details/77849403
- Queue与Deque的区别
前言 在研究java集合源码的时候,发现了一个很少用但是很有趣的点:Queue以及Deque,平常在写leetcode经常用LinkedList向上转型Deque作为栈或者队列使用,但是一直都不知 ...
- -k 组合调用执行部分用例
场景:只执行符合要求的某一部分用例,通过类与方法的命名实 现.通常编写测试方法时 • 解决:使用-k • pytest -k "TestClass and test_one" • ...
- .Net Core身份认证:IdentityServer4实现OAuth 2.0 客户端模式
一.客户端模式介绍 客户端模式(Client Credentials Grant)是指客户端直接向认证服务(Authorization Server)发送认证请求,获取token,进行认证,一般适用于 ...
- Java面试宝典(2)Java基础部分
31.String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有? 没有.因为Str ...
- MySQL - Lock wait timeout exceeded
今天突然出了个奇怪的问题,原本正常启动的项目,在什么都没有修改的情况下,启动到一半的时候会卡住几分钟,几分钟后又成功启动了,刚好是卡在Quartz那里,还以为出什么奇奇怪怪的幺蛾子了,一看日志,数据库 ...
- PHP通过KMP算法实现strpos
起因 昨天看了阮一峰老师的一篇博客<字符串匹配的KMP算法>,讲的非常棒.这篇文章也是解决了: 有一个字符串"BBC ABCDAB ABCDABCDABDE",里面是否 ...
- mysql数据库用户权限设置
设置用户权限:格式:grant 权限列表 on 数据库名.表名 to '用户名'@'来源地址' identified by '密码'; * 权限列表:用于列出授权的各种数据库操作,通过逗号进行分割,如 ...
- 牛客多校第六场-H-Pair
链接:https://ac.nowcoder.com/acm/contest/887/H来源:牛客网 题目描述 Given three integers A, B, C. Count the numb ...
- v-for 循环 绑定对象 和数组
<!--v-for 迭代数组--> <div id="app11"> <div v-for="info in infos"> ...