传送门

这道题比我想象之中要暴力一些。

自己一开始有一份写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 靶型数独的更多相关文章

  1. 一本通&&洛谷 ——靶型数独——题解

    题目传送 主要是搜索顺序不同导致效率千差万别. 联想人做数独的策略,总是先填可填数最少的那个空,再填选择第二少的...其实这种策略就造就了一个深度浅时分支也较少的搜索树.合适的搜索顺序再配合剪枝==A ...

  2. 「NOIP2009」靶形数独

    传送门 Luogu 解题思路 这题其实挺简单的. 首先要熟悉数独,我们应该要优先搜索限制条件多的行,也就是可能方案少的行,显然这样可以剪枝,然后再发挥一下dfs的基本功就可以了. 细节注意事项 爆搜题 ...

  3. 洛谷1074 靶状数独dfs 排序、记录、搜索

    题目网址:https://www.luogu.com.cn/problem/P1074 大意就是在一个9*9的数独中填数,要求行列宫都是九个互不相同的数字,给定一定的得分机制,要求求解最大得分.思路大 ...

  4. 【noip2009】靶形数独

    题解: 又是搜索- - 加状态压缩剪枝 二进制记下每行 每列 每个九宫格用过的数是谁 枚举的时候可以O(1)判断冲突 还有个很重要的剪枝 把可能使用数字最少的格子先搜索 代码: #include &l ...

  5. ZJOI2017 Day1

    私のZJOI Day1 2017-3-21 07:52:53 有人在暴力膜 苟-- 富贵 无相忘 ZJOI2017交流群 133135071 如果你足够厉害 如果你足够厉害 如果你足够厉害 其实完全可 ...

  6. [USACO11NOV]二进制数独Binary Sudoku

    传送门 这道题是很好的一道IDA*练习题. 首先我们先确定搜索的框架,我们要求的是用最少的修改次数使得所有的行,列,宫之内都有偶数个1,最直观的想法显然是先预处理出有奇数个1的行,列,宫,之后枚举每一 ...

  7. 洛谷P3585 [POI2015]PIE

    传送门 题目大意:有个n*m的格子图,要求'x'点要被染成黑色 有个a*b的印章,'x'是可以染色的印章上的点. 要求用印章去染色格子 (1)印章不可以旋转. (2)不能把墨水印到纸外面. (3)纸上 ...

  8. DLX算法一览

    目录: 1 X思想的了解. 链表的递归与回溯. 具体操作. 优化. 一些应用与应用中的再次优化(例题). 练手题 X思想的了解. 首先了解DLX是什么? DLX是一种多元未饱和型指令集结构,DLX 代 ...

  9. 靶形数独 (dfs+预处理+状态压缩)

    #2591. 「NOIP2009」靶形数独 [题目描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们 ...

随机推荐

  1. django cookie session操作

    Cookie是什么? cookie说的直白点就是保存在用户浏览器端的一个键值对,举个例子,你现在登录了京东商城,你把浏览器关闭之后,你再打开京东,你还是可以对你的账户继续操作,已经购买的商品,订单都是 ...

  2. 2017 ACM/ICPC Asia Regional Xian Online 记录

    题目链接  Xian

  3. IntelliJ IDE 各种插件的安装和使用

    插件的安装和使用持续的更新中...........................................................

  4. 解决Eclipse中SVN版本信息不显示的问题

    eclipse  中使用 svn 插件,原本正常,未作任何更改,最近几天突然eclipse 中查看文件时,文件后面的 版本号 . 文件的状态图标 等等都不见了.以为有插件冲突,卸载了好多其他的相关的插 ...

  5. 新建mvc项目

    第一步 第二步 第三步,ok项目建好

  6. iOS开发-用keychain替代UDID

    从2013-5-1日开始苹果就禁止对UUID的应用的通过了.所以我们需要用一些办法替换,下面我就是用keychain的访问替换掉UUID的. 那么,关于Keychain的应用,Apple提供了一个叫G ...

  7. Linux 开发板网络设置

    改动IP地址步骤: ①改动/etc/eth0-setting 命令:vi /etc/eth0-setting ②改动对应的信息.最后:wq退出 ③重新启动eth0 命令:/etc/init.d/ifc ...

  8. time is always a factor, time is always now!!!!

    https://www.linkedin.com/pulse/time-always-now-joe-alderman ---------------------------------------- ...

  9. iOS之中国银联移动支付控件升级的问题

    自从11月以来,如果用户安装了集成了中国银联手机支付SDK的app,那么在使用银联支付的时候,会发现,不能调用银联支付方式,并且弹出一个提示”银联手机支付已升级请更新客户端8100010”.如下图: ...

  10. codeforces 553 A Kyoya and Colored Balls

    这个题.比赛的时候一直在往dp的方向想,可是总有一个组合数学的部分没办法求, 纯粹组合数学撸,也想不到办法-- 事实上,非常显然.. 从后往前推,把第k种颜色放在最后一个,剩下的k球.还有C(剩余的位 ...