WOJ-478 Sodu……ku
来源:互联网 发布:airpods mac 编辑:程序博客网 时间:2024/04/29 07:35
点击这里查看题目
题意很简单,就是解数独,Note中说“不要想太多,尝试着使用暴力”,于是我就大胆的暴力回溯过了。
乍一想,81层递归,每一层有9个选项,相当于需要遍历9^81次,大约是2*10^77,而限时1秒钟,计算机大约能运算10^9次,用脚指头想都觉得过不了。
然而……21毫秒过了????? 21毫秒?????
后来仔细想了一下,重点在于able()函数,由于有albe()函数判断进行剪枝,虽然每次判断要进行至多27条判断,但是每减去一枝,都能省下远比27多无数倍的运算次数,而且数独越到后面,约束越多,很容易出现1-9都不适用的情况,所以剪枝剪得非常疯狂,导致回溯回得非常迅速,所以,暴力真心能过……
#include<iostream>using namespace std;bool org[12][12];int ans[12][12];bool able(int r,int c,int t){ int rr=r/3*3,cc=c/3*3; for(int i=rr;i<rr+3;i++) { for(int j=cc;j<cc+3;j++) { if(ans[i][j]==t)return false; } } for(int i=0;i<9;i++) { if(ans[i][c]==t)return false; if(ans[r][i]==t)return false; } return true;}bool flag=false;void solve(int r,int c){ if(c>=9){r++;c=0;} if(r>=9){flag=true;return;} if(org[r][c]==true) { solve(r,c+1); if(flag)return; } else { for(int i=1;i<=9;i++) { if(able(r,c,i)) { ans[r][c]=i; solve(r,c+1); if(flag)return; ans[r][c]=0; } } }}int main(){ for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { cin>>ans[i][j]; if(ans[i][j]!=0)org[i][j]=true; else org[i][j]=false; } } solve(0,0); for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { cout<<ans[i][j]<<" "; } cout<<endl; }}
阅读全文
0 0
- WOJ-478 Sodu……ku
- WOJ
- woj
- Ku波段
- pic ku--不要查看
- linux入门(type sodu)
- WOJ 1020
- WOJ 1014
- WOJ 1055
- WOJ-1402
- WOJ--1314
- WOJ-1315
- WOJ-1316
- WOJ-1100
- woj-1301
- WOJ-1167
- WOJ 1619
- woj 1538
- 对象模型中的常见对象
- Azure VNet config document
- 快速GCD算法
- 解剖网络请求框架Volley
- springboot-data-jpa使用
- WOJ-478 Sodu……ku
- Tensorflow实现cnn模型的训练与使用
- SpringBoot JPA学习概要总结
- js中如何实现java中的 replaceAll
- Apache Spark 2.2.0 中文文档
- JAVA设计模式之单例模式
- 扫地机器人十大品牌及选购技巧
- jquery easyui 排序
- android 代码混淆配置