题目传送门

题意:

给你16个16宫格的数独,里面是0~F,你可以逆时针旋转里面的每个16宫格

问你它是从标准数独逆时针旋转多少次得到?

思路:

可以知道每个16宫已经是标准的了,接下来只要考虑每行、每列就行了

那么我们在dfs中就可以用两个行列两个数组来标记每个数字出现的次数,

大于1则不行

另外此时是逆时针来的,那么你就要顺时针回去

逆一次等于顺3次

参考博客:https://www.cnblogs.com/zquzjx/p/10326048.html

代码:

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 25
int g[N][N],G[N][N];
int R[N][N],C[N][N];
int ans; int get(int x,int y,int I,int J,int k)
{
if(k==) return g[y+-J+][x+I];
else if(k==) return g[x+-I+][y+-J+];
else if(k==) return g[x][y+-I+];
else return g[x+I][y+J];
}
bool Rotate(int x,int y,int k)
{
bool flag=;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
int xx=(x-)*+i;
int yy=(y-)*+j;
G[xx][yy]=get(xx,yy,i,j,k);//cout<<xx<<" "<<yy<<" "<<G[xx][yy]<<endl;
// cout<<(x-1)*4+i<<" "<<(y-1)*4+j<<endl;
int r=++R[xx][G[xx][yy]];
int l=++C[yy][G[xx][yy]];
if(r>||l>) flag=;
}
}
return flag;
}
void reRotate(int x,int y)
{
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
int xx=(x-)*+i;
int yy=(y-)*+j;
--R[xx][G[xx][yy]];
--C[yy][G[xx][yy]];
G[xx][yy]=g[xx][yy];
}
}
}
void dfs(int x,int y,int sum)
{
if(x==)
{
ans=min(ans,sum);
return ;
}
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);
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
char s[];
for(int i=;i<=;i++)
{
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'+;
}
}
/*for(int i=1;i<=16;i++){
for(int j=1;j<=16;j++)
printf("%d",g[i][j]);
cout<<endl;}*/
memset(R,,sizeof(R));
memset(C,,sizeof(C));
ans=INF;
dfs(,,);
printf("%d\n",ans);
}
return ;
}

参考代码:

#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 Problem J. Let Sudoku Rotate (dfs)的更多相关文章

  1. HDU-6341 Problem J. Let Sudoku Rotate(dfs 剪枝)

    题目:有一个4*4*4*4的数独,每一横每一竖每一个小方块中都无重复的字母,即都为0-9,A-F..有一个已经填好的数独,若干个4*4的方块被逆时针拧转了若干次,问拧转回来至少需要多少次. 分析:很明 ...

  2. 2018 Multi-University Training Contest 4 Problem J. Let Sudoku Rotate 【DFS+剪枝+矩阵旋转】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6341 Problem J. Let Sudoku Rotate Time Limit: 2000/100 ...

  3. HDU - 6341 多校4 Let Sudoku Rotate(状压dfs)

    Problem J. Let Sudoku Rotate Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K ...

  4. hdu第4场j.Let Sudoku Rotate

    Problem J. Let Sudoku Rotate Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Su ...

  5. 深度优先搜索(dfs)与出题感想

    在3月23号的广度优先搜索(bfs)博客里,我有提到写一篇深搜博客,今天来把这个坑填上. 第一部分:深度优先搜索(dfs) 以上来自百度百科. 简单来说,深度优先搜索算法就是——穷举法,即枚举所有情况 ...

  6. LeetCode Subsets (DFS)

    题意: 给一个集合,有n个互不相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: DFS方法:由于集合中的元素是不可能出现相同的,所以不用解决相同的元素而导致重复统计. class Sol ...

  7. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  8. 【算法导论】图的深度优先搜索遍历(DFS)

    关于图的存储在上一篇文章中已经讲述,在这里不在赘述.下面我们介绍图的深度优先搜索遍历(DFS). 深度优先搜索遍历实在访问了顶点vi后,访问vi的一个邻接点vj:访问vj之后,又访问vj的一个邻接点, ...

  9. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

随机推荐

  1. 基于TMS320C6678、FPGA XC5VLX110T的6U CPCI 8路光纤信号处理卡

    基于TMS320C6678.FPGA XC5VLX110T的6U CPCI 8路光纤信号处理卡 1.板卡概述 本板卡由我公司自主研发,基于CPCI架构,符合CPCI2.0标准,采用两片TI DSP T ...

  2. Taro -- 微信小程序wxParse达到html转换wxml

    Taro微信小程序可以用wxParse来达到html转换wxml的效果:https://github.com/NervJS/taro-components-test/blob/master/src/p ...

  3. Firewalld--01 防火墙安全、基本指令、区域配置

    目录 Firewalld防火墙安全.基本指令.区域配置 1. 防火墙安全基本概述 2. 防火墙使用区域管理 3. 防火墙基本指令参数 4.防火墙区域配置策略 Firewalld防火墙安全.基本指令.区 ...

  4. 7——C++类的使用

     定义了一个类之后,便可以如同用int.double等类型符声明简单变量一样,创建该类的对象,称为类的实例化.           类的定义实际上是定义了一种类型,类不接收或存储具体的值,只作为生成具 ...

  5. oracle常用操作方法

    ---oracle创建数据库,基于plsqldev工具 1.创建表空间,创建空内容的物理文件create tablespace db_test --表空间名 datafile 'D:\test.dbf ...

  6. css--图片整合(精灵图)

    图片整合(精灵图) 精灵图的优点: 减少图片的字节 减少了网页的http请求,从而大大的提高了页面的性能 解决了网页设计师在图片命名上的困扰,只需对一张集合的图片上命名就可以了,不需要对每一个小元素进 ...

  7. PHP与CI学习笔记

    CodeIgniter框架学习 安装 下载好包后,解压复制 system 和 application 目录到网站目录下 配置 配置目录 打开index.php设置好 $system_path . $a ...

  8. Python PEP8代码书写规范

    摘自: 规范 https://blog.csdn.net/ratsniper/article/details/78954852

  9. TFrecords读、写图片文件

    参考:https://blog.csdn.net/u014802590/article/details/68495238 参考:https://www.2cto.com/kf/201709/68057 ...

  10. django2 + python3 显示静态文件中的图片

    之前一直搞不出来 是因为图片的问题,步骤也就是固定的几步,到位了就差不多成了 文件夹结构: . ├── HelloWorld │   ├── __init__.py │   ├── __pycache ...