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 ...
随机推荐
- UVA11134_Fabled Rooks
大概题意: 在n*n的棋盘上面放n个车,能否使他们互相不攻击(即不能在同一行一列),并且第i个车必须落在第i的矩形范围(xl,yl, xr,yr)之内 xy互相并不干扰,所以就可以把这个二维问题压缩成 ...
- Django Paginator分页器
如何实现在django中实现分页效果,我使用的是django自带的分页器paginator具体是使用办法是这样的首先引用from django.core.paginator import Pagina ...
- 学习Spring时用Idea中Maven Project创建一个子module出现了子pom.xml没有继承父pom.xml
正常情况: 解决方法: 1.首先点击父项目右键 -->new-->Module 2.不用点击create from achetype直接点击next 3.在ArtifactId输入你要mo ...
- Optparse 简介
optparse 这个库的主要作用是可以用为脚本提供传递命令参数功能 一个简单的例子 def main(): parser = OptionParser(usage = "usage: %p ...
- 让所有Excel数据格全部乘 某个数
1 首先设置单元格格式要是数字 2 然后在随便一个单元格写入你要乘的数字 3 粘贴的时候设置选择性粘贴,然后设置乘就OK
- CFgym100020 Problem J. Uprtof
题意:给你n个点m无向条边.每个点是黑色或者白色的.m条边第一条边边权为2^m,第二条边边权为2^(m-1)....... .在这个图上选择一些边连起来,使得满足:每个黑点连奇数条边,每个白点连偶数条 ...
- linux开放指定端口命令
方式一 CentOS: 1.开启防火墙 systemctl start firewalld 2.开放指定端口 firewall-cmd --zone=public --add-p ...
- nodejs 模板引擎jade的简单使用(2)
1.jade html head style body div.box div#div1 div aaa div(class="aaa left-warp active") div ...
- webpack配置(使用react,es6的项目)
const path = require('path');const webpack = require('webpack');const HtmlWebpackPlugin = require('h ...
- Qt 【遍历文件夹文件,为listwidgetItem设置图标】
效果图如上,通过qt本身的api去获取文件夹中文件的信息并且将其显示到listwidget上.只遍历当前文件夹的文件, 若文件夹中的子文件夹含有符合筛选器的文件那么并不会一同筛选出来 参考百度:htt ...