一、题意

Sudoku is a logic-based, combinatorial number-placement puzzle, which is popular around the world.
In this problem, let us focus on puzzles with 16×16 grids, which consist of 4×4 regions. The objective is to fill the whole grid with hexadecimal digits, i.e. 0123456789ABCDEF, so that each column, each row, and each region contains all hexadecimal digits. The figure below shows a solved sudoku.

考虑一个完成后的数独游戏局面,将16*16的局面分割成4*4的小方块,随机旋转小方块得到一个新的局面,现在给出新的局面,问你最少旋转几次可以得到一个完成的局面。

二、解题思路。

首先考虑暴力搜索,4^16次方次旋转——来自每个小方块4次旋转,一共16个小方块。

但是考虑数独游戏的特征,每走一步都可以判断当前的选择是否合法——因此可以进行剪枝——判断下当前所在方块、所在形状的合法性——已经取到的行、列是否合法。

处于某种我证明不了的原因认为,这种方式将会把剪枝操作剪到足够小,以至于31ms就可以搞定1000组输入。

#include<bits/stdc++.h>
using namespace std; #define ll long long
const int MAXN=; char mapp[MAXN][MAXN]; int ans=; int tran(char c)
{
if(c>=''&&c<='')return c-'';
else return c-'A'+;
} bool check_left(int a,int b)
{
// int x = a*4;
int endd = (b+)*;
if(b == )return true;
for(int i=;i<;++i)
{
int x = a* +i;
int ch[];
memset(ch,,sizeof(ch));
for(int j=;j<endd;++j)
{
ch[tran(mapp[x][j])]++;
if(ch[tran(mapp[x][j])] == )return false;
}
}return true;
} bool check_up(int a,int b)
{
int endd = (a+)*;
if(a == )return true;
for(int j=;j<;++j)
{
int y = b*+j;
int ch[];
memset(ch,,sizeof(ch));
for(int i=;i<endd;i++)
{
ch[tran(mapp[i][y])]++;
if(ch[tran(mapp[i][y])] == )return false; }
}return true;
} bool check(int a,int b)
{
return check_left(a,b)&&check_up(a,b);
} bool check(int l)
{
for(int i=;i<;++i)
{
int x = l*+i;
int ch[];
memset(ch,,sizeof(ch));
for(int j=;j<;++j)
{
ch[tran(mapp[x][j])]++;
if(ch[tran(mapp[x][j])]==)return false;
}
}
return true;
} void change(int a,int b)
{
int x = a*;
int y = b*; int tmp = mapp[x][y];
mapp[x][y] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = tmp; tmp = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = tmp; tmp = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = tmp; tmp = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = tmp; } void change1(int a,int b)
{
int x = a*;
int y = b*; int tmp = mapp[x][y];
mapp[x][y] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = tmp; tmp = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = tmp; tmp = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = tmp; tmp = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = mapp[x+][y+];
mapp[x+][y+] = tmp; }
bool search(int a,int b,int summ)
{ // cout<<"search : "<<a<<" "<<b<<" step: "<<summ<<endl; if(b==)
{
if(check(a)){
ans += summ;
return true;
}
return false;
} if(search(a,b+,summ))return true;
for(int i=;i<;++i)
{
change1(a,b);
if(search(a,b+,summ++i))return true;
}
change1(a,b);
return false;
} bool dfs(int now,int summ)
{
int a = now/;
int b = now%;
if(now == )
{
ans = min(ans,summ);
return true;
}
if(check(a,b)&&dfs(now+,summ));
for(int i=;i<;++i)
{
change1(a,b);
if(!check(a,b))continue;
dfs(now+,summ+i+);
}
change1(a,b);
return false;
} void show()
{
for(int i=;i<;++i)
{
for(int j=;j<;++j)
{
cout<<mapp[i][j];
}cout<<endl;
}
} void init()
{
ans = INT_MAX;
for(int i=;i<;++i)gets(mapp[i]);
dfs(,);
cout<<ans<<"\n";
} int main()
{ int t;
// cin>>t;
scanf("%d\n",&t);
while(t--)init(); return ;
}

HDU暑假多校第四场J-Let Sudoku Rotate的更多相关文章

  1. hdu第4场j.Let Sudoku Rotate

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

  2. HDU 4635 多校第四场 1004 强联通

    我还有什么好说,还有什么好说...... 我是SBSBSBSBSBSBSBSBSBSBSBSBBSBSBSBSBSBSBSBSBS........................ 题意 思路什么的都不 ...

  3. 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)

    题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...

  4. HDU 全国多校第四场 题解

    题解 A AND Minimum Spanning Tree 参考代码: #include<bits/stdc++.h> #define maxl 200010 using namespa ...

  5. 2019牛客多校第四场J free——分层图&&最短路

    题意 一张无向图,每条边有权值,可以选择不超过 $k$ 条路使其权值变成0,求 $S$ 到 $T$ 的最短路.(同洛谷 P4568) 分析 首先,分层图最短路可以有效解决这种带有 「阶段性」的最短路, ...

  6. 牛客多校第四场 J Free 最短路

    题意: 求最短路,但是你有k次机会可以把路径中某条边的长度变为0. 题解: 跑k+1次迪杰斯特拉,设想有k+1组dis数组和优先队列,第k组就意味着删去k条边的情况,每次松弛操作,松弛的两点i,j和距 ...

  7. 2019牛客多校第四场J free 最短路

    free 题意 给出一个带权联通无向图,你需要从s走到t,你可以选择k条变让他们的权值为0问从s到t的最小权值是多少? 分析 思考一下,如果不带k条白嫖这个条件,那么这就是一个简单的dji就搞定了,我 ...

  8. 2018牛客多校第四场 J.Hash Function

    题意: 给出一个已知的哈希表.求字典序最小的插入序列,哈希表不合法则输出-1. 题解: 对于哈希表的每一个不为-1的数,假如他的位置是t,令s = a[t]%n.则这个数可以被插入当且仅当第s ~ t ...

  9. HDU暑假多校第八场G-Card Game

    一.题意 给出N个卡牌,卡牌的正反两面具有两个数字,取值范围为[1,2*n],给出若干个默认正面向上的卡牌,求最小反转多少张卡牌可以使得,每张卡牌朝上的面上都有一个不同的数字,同时满足最小反转次数的反 ...

随机推荐

  1. 【Spring实战】—— 9 AOP环绕通知

    假如有这么一个场景,需要统计某个方法执行的时间,如何做呢? 典型的会想到在方法执行前记录时间,方法执行后再次记录,得出运行的时间. 如果采用Spring的AOP,仅仅使用前置和后置方法是无法做到的,因 ...

  2. expdp/impdp使用sysdba权限迁移数据

    expdp 'userid="/ as sysdba"' directory=DATA_PUMP_DIR full=y logfile=fullexp.log estimate_o ...

  3. elasticsearch 概念

    elasticsearch 来源:https://baike.baidu.com/item/elasticsearch/3411206?fr=aladdin ElasticSearch是一个基于Luc ...

  4. simple2.py

    #coding: utf-8 import xlsxwriter workbook = xlsxwriter.Workbook('chart.xlsx') worksheet = workbook.a ...

  5. 第一次在stack overflow回答问题

    越发感觉英语的重要性,尝试阅读英文与写作英文.于是选择了stack overflow来进行实践.作为萌新小白,只学习过C语言,就在c标签下乱逛.尝试看懂一些问题且试着回答. 发现一个问题: I nee ...

  6. 浏览器下出现net::ERR_BLOCKED_BY_CLIENT的解决办法

    转发网址:https://www.cnblogs.com/wenzheshen/p/7724065.html 当我们在做开发时,调试页面图片会出现部分图片无法正常显示,并且确认图片的地址正确: 按F1 ...

  7. extension Kingfisher where Base: Image:泛型类型的具体化与实例化

    具体化:针对特定的类型参量进行二次定义: 实例化:实例化:

  8. python:部分内置函数与匿名函数

    一.内置函数 1,数据类型:int,bool .......... 2,数据结构:dict,list,tuple,set,str 3,reversed--保留原列表,返回一个反序的迭代器 revers ...

  9. 如何确定VS编译器版本

    _MSC_VER是MSVC编译器的内置宏,定义了编译器的版本,_MSC_VER 值对应版本关系 MSVC++ 11.0 _MSC_VER = 1700 (Visual Studio 2012)  MS ...

  10. ProjectServer任务审批后自动发布

    我们知道ProjectServer汇报工时的顺序是这样: 1.项目成员打开自己的时间表,选择要汇报的任务,在汇报工时栏填写实际工时. 2.汇报工时后点击保存. 3.将汇报工时的任务提交给项目经理. 4 ...