NOIP2009 靶型数独
这道题比我想象之中要暴力一些。
自己一开始有一份写9*9数独的代码,自己试了一下直接交上去只有40分。看来这样是肯定不行的。考虑优化,想在中间贪贪心啥的,但是难以保证正确性。最后学了一招,从数字比较多的行开始搜索,这样会使搜索树变得小一些,时间就会减少一些。
然后交上去之后还是只有75分……发现自己数独判断合法的老代码效率太低了,改了一下之后终于成功的过了。
这个题其实虽然有些剪枝但是还是好暴力……
看一下代码。
// luogu-judger-enable-o2
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<ctime>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n') using namespace std;
typedef long long ll;
const int M = ; int read()
{
int ans = ,op = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') op = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
ans *= ;
ans += ch - '';
ch = getchar();
}
return ans * op;
} bool pd[][],flag;
int num[][],visg[][],vish[][],visl[][];
int curx[] = {,,,,,,,,,};
int cury[] = {,,,,,,,,,};
int sco[][] =
{
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,}
}; struct line
{
int sum,id,loc;
bool operator < (const line &g) const
{
return sum < g.sum;
}
}a[]; int m,n,tot,px,py,maxn = -; bool find(int kx)
{
rep(i,a[kx].loc,)
{
rep(j,,)
{
if(!num[a[i].id][j])
{
px = a[i].id,py = j;
return ;
}
}
}
return ;
} void write()
{
rep(i,,)
{
rep(j,,) printf("%d ",num[i][j]);enter;
}
} void calc()
{
int cur = ;
rep(i,,)
rep(j,,) cur += num[i][j] * sco[i][j];
maxn = max(maxn,cur);
} void dfs(int dx,int dy)
{
int g = (dx - ) / * + (dy - ) / ;
rep(k,,)
{
if(vish[dx][k] || visl[dy][k] || visg[g][k]) continue;
vish[dx][k] = visl[dy][k] = visg[g][k] = ,num[dx][dy] = k;
if(find(dx)) dfs(px,py);
else calc();//write();
vish[dx][k] = visl[dy][k] = visg[g][k] = ,num[dx][dy] = ;
}
}
int main()
{
clock_t start,end;
start = clock();
rep(i,,)
{
a[i].id = i;
rep(j,,)
{
int g = (i - ) / * + (j - ) / ;
num[i][j] = read();
if(!num[i][j]) a[i].sum++;
else vish[i][num[i][j]] = visl[j][num[i][j]] = ,visg[g][num[i][j]] = ;
}
}
sort(a+,a+);
rep(i,,) a[a[i].id].loc = i;
if(find(a[].id)) dfs(px,py);
printf("%d\n",maxn);
end = clock();
double seconds = (double)(end - start) / CLOCKS_PER_SEC;
//printf("%.8lf\n",seconds);
return ;
}
NOIP2009 靶型数独的更多相关文章
- 一本通&&洛谷 ——靶型数独——题解
题目传送 主要是搜索顺序不同导致效率千差万别. 联想人做数独的策略,总是先填可填数最少的那个空,再填选择第二少的...其实这种策略就造就了一个深度浅时分支也较少的搜索树.合适的搜索顺序再配合剪枝==A ...
- 「NOIP2009」靶形数独
传送门 Luogu 解题思路 这题其实挺简单的. 首先要熟悉数独,我们应该要优先搜索限制条件多的行,也就是可能方案少的行,显然这样可以剪枝,然后再发挥一下dfs的基本功就可以了. 细节注意事项 爆搜题 ...
- 洛谷1074 靶状数独dfs 排序、记录、搜索
题目网址:https://www.luogu.com.cn/problem/P1074 大意就是在一个9*9的数独中填数,要求行列宫都是九个互不相同的数字,给定一定的得分机制,要求求解最大得分.思路大 ...
- 【noip2009】靶形数独
题解: 又是搜索- - 加状态压缩剪枝 二进制记下每行 每列 每个九宫格用过的数是谁 枚举的时候可以O(1)判断冲突 还有个很重要的剪枝 把可能使用数字最少的格子先搜索 代码: #include &l ...
- ZJOI2017 Day1
私のZJOI Day1 2017-3-21 07:52:53 有人在暴力膜 苟-- 富贵 无相忘 ZJOI2017交流群 133135071 如果你足够厉害 如果你足够厉害 如果你足够厉害 其实完全可 ...
- [USACO11NOV]二进制数独Binary Sudoku
传送门 这道题是很好的一道IDA*练习题. 首先我们先确定搜索的框架,我们要求的是用最少的修改次数使得所有的行,列,宫之内都有偶数个1,最直观的想法显然是先预处理出有奇数个1的行,列,宫,之后枚举每一 ...
- 洛谷P3585 [POI2015]PIE
传送门 题目大意:有个n*m的格子图,要求'x'点要被染成黑色 有个a*b的印章,'x'是可以染色的印章上的点. 要求用印章去染色格子 (1)印章不可以旋转. (2)不能把墨水印到纸外面. (3)纸上 ...
- DLX算法一览
目录: 1 X思想的了解. 链表的递归与回溯. 具体操作. 优化. 一些应用与应用中的再次优化(例题). 练手题 X思想的了解. 首先了解DLX是什么? DLX是一种多元未饱和型指令集结构,DLX 代 ...
- 靶形数独 (dfs+预处理+状态压缩)
#2591. 「NOIP2009」靶形数独 [题目描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们 ...
随机推荐
- T2597 团伙 codevs
http://codevs.cn/problem/2597/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 1920年的芝加 ...
- DBA总结
HA MHA(1)从宕机崩溃的master保存二进制日志事件(binlog events);(2)识别含有最新更新的slave:(3)应用差异的中继日志(relay log)到其他的slave:(4) ...
- 关于使用uitableview 中cell 来实现uiimageview的复用和图片的异步加载
apple sample lazytableimages 1,首先设置横向显示的uitableview self.customTableview.transform = CGAffineTransfo ...
- grafana结合influxdb、open-falcon出图配置
1.https://www.jianshu.com/p/fadcf4d92b0e 2.https://www.jianshu.com/p/21ce6ee143f3 3.http://www.super ...
- 自己动手实现浏览器,21天自制chromium:起手篇
转:https://zhuanlan.zhihu.com/p/29101613?utm_medium=social&utm_source=qq 大家好,我又来了.这篇是21天自制原子弹的姐妹篇 ...
- TCP/IP Protocol Architecture
原文: https://technet.microsoft.com/en-sg/library/cc958821.aspx 1. 主机到网络层 2.网络互连层(互连这个翻译好) ----------- ...
- memcached优化方法
工作原理 基本概念:slab,page.chunk. slab,是一个逻辑概念. 它是在启动memcached实例的时候预处理好的,每一个slab相应一个chunk size.也就是说 ...
- HTML小知识点积累
1.怎样让heigth:100%起效? 有时候我们设置heigth:100%,想让当前控件铺满整个屏幕,可是非常少情况下这个属性能达到我们想要的效果,这是为什么呢? 而依据W3C的规范.百分比 ...
- HTML页面底部无用留白
HTML页面底部无用留白,可以再footer样式中加入: overflow: hidden; 如有错误,请您指正~
- HDU2084_数塔【简单题】【数塔】
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...