博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
题解 P1074 【靶形数独 】
阅读量:6672 次
发布时间:2019-06-25

本文共 2600 字,大约阅读时间需要 8 分钟。

这是一神题!!!

可能是因为我太弱了,题解都看不太懂QWQ

不过感谢wng老师的提醒,我写出了这个样的的代码。

分析:

这道题是一个搜索(dfs)。很神奇很暴力的题

首先,你需要看懂题目。(可以先去玩下正常的数独,然后基本就明白了....)
其次,应题目要求,我们使用三个数组来标记在此位置填数合不合法,然后有一个非常自然的想法,从每个位置来搜,填数后递归,填完后计算出答案,取最大值。
不过你会发现你爆栈了!!!
所以我开三个数组,记录行列以及九宫格的状态,只有在三个数组中都未出现的值才可以被填入,不过我是反着搜的。

CODE:

// luogu-judger-enable-o2#include
#include
#include
#define ll long long#define re register//define大法好!!!using namespace std;bool line[10][10],roway[10][10],nine[10][10];int a[10][10],b[10][10];int got[10][10][10];int ans = -1, score;inline int math_sign(int x,int y ,int z){ if(x == 5 && y == 5) return 10 * z; else if(x >= 4 && x <= 6 && y >= 4 && y <= 6) return 9 * z; else if(x >= 3 && x <= 7 && y >= 3 && y <= 7) return 8 * z; else if(x >= 2 && x <= 8 && y >= 2 && y <= 8) return 7 * z; else return 6 * z;}//模拟数独的得分方式inline bool get_score(int x,int y,int z){ if(roway[x][z] || line[y][z] || nine[(x - 1) / 3 * 3 + (y - 1) / 3][z]) return 0; b[x][y] = z; roway[x][z] = line[y][z] = nine[(x - 1) / 3 * 3 + (y - 1) / 3][z] = 1; score += got[x][y][z]; return 1;}inline int _read(){ re int x = 0; re int flag = true; re int k = getchar(); while(k != '-' && !isdigit(k)) k = getchar(); if(k == '-'){ k = getchar(); flag = false; } while(isdigit(k)){ x = x * 10 + k - '0'; k = getchar(); } return (flag ? x : -x);}//读入优化,不会的可以背一下inline void del(int x,int y,int z){ roway[x][z] = line[y][z] = nine[(x - 1) / 3 * 3 + (y - 1)/3][z] = 0;}void dfs(int x,int y ){ if(x == 10 && y == 1){ ans = max(ans,score); return; } if(b[x][y]){ if(y == 9) dfs(x + 1, 1); else dfs(x,y + 1); } else{ for(int i = 1 ;i <= 9 ;i++){ int t = score; if(get_score(x,y,i)){ if(y == 9) dfs(x + 1,1); else dfs(x,y + 1); del(x,y,i); score = t; } } b[x][y] = 0; }}int main(){ for(int i = 1; i<= 9; i++) for(int j = 1; j <= 9 ;j++) for(int k = 1; k<= 9 ; k++) got[i][j][k] = math_sign(i,j,k); for(int i = 9; i > 0 ; i--) for(int j = 9; j > 0 ; j--){ a[i][j] = _read(); if(a[i][j]) get_score(i,j,a[i][j]); } dfs(1,1); printf("%d",ans); return 0;}

没错,我开了O2优化,额————其实是因为之前花式被卡,各种TLE,于是我就打开了氧气罐子优化QAQ。。。

祝大家早日AC,不再TLE。(点个赞吧)

转载于:https://www.cnblogs.com/Repulser/p/9579866.html

你可能感兴趣的文章
神奇犁头草,治疗肿毒效如神
查看>>
linux的发行版
查看>>
PHP环境配置中遇到的各种问题解决方法: Cannot load php5apache2_2.dll into server
查看>>
我的友情链接
查看>>
无意看见的几句话
查看>>
常用Linux Shell命令组合-- 运维常用总结
查看>>
XBMC 在UBUNTU 12.04中安装及设置
查看>>
解决mac下无法剪贴、复制、粘贴问题
查看>>
Oracle运维脚本
查看>>
第1部分 Windows Server2008安装和配置
查看>>
cordova环境配置
查看>>
ORA-06553: PLS-553: character set name is not recognized, while starting Content Store
查看>>
Watches OpenCart 主题模板 ABC-0088
查看>>
linux iptables 相关应用
查看>>
Linux基础
查看>>
升级到FTK 4.0.2可免费使用可视化分析模块30天
查看>>
怎样做好DNS服务器的保护
查看>>
Java对象创建时的初始化顺序
查看>>
linux bash环境变量简单总结
查看>>
前端 调试小技巧
查看>>