POJ2676-搜索-Sudoku
来源:互联网 发布:淘宝卖家怎么搞到发票 编辑:程序博客网 时间:2024/06/16 00:33
https://vjudge.net/problem/POJ-2676
一看这道题,就感觉很难。。
其实也还好,和我大致想象的差不多,
不过没有想到他的存储方式。
和搜索的技巧。
有一个问题,我把输入范围改成 1-9,就错了,一直不明白为什么。。该改的地方都改了。
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;/*我看了一下题,就觉得自己肯定不会这道题。。其实仔细想想,还是可以写的。暴力搜索而已,剪枝更是异常明白,纯码力题。*/const int maxn=11;int h[maxn];int l[maxn];int a[maxn][maxn];int border[maxn];bool flag;int judge( int m , int n ){ if ( m>=0 && m<3 && n>=0 && n<3 ) return 0; else if ( m>=0 && m<3 && n>=3 && n<6 ) return 1; else if ( m>=0 && m<3 && n>=6 && n<9 ) return 2; else if ( m>=3 && m<6 && n>=0 && n<3 ) return 3; else if ( m>=3 && m<6 && n>=3 && n<6 ) return 4; else if ( m>=3 && m<6 && n>=6 && n<9 ) return 5; else if ( m>=6 && m<9 && n>=0 && n<3 ) return 6; else if ( m>=6 && m<9 && n>=3 && n<6 ) return 7; else if ( m>=6 && m<9 && n>=6 && n<9 ) return 8;}int init(){ memset(l,0,sizeof(l)); memset(h,0,sizeof(h)); memset(a,0,sizeof(a)); memset(border,0,sizeof(border)); int sum=0; for(int i=0;i<9;i++) for(int j=0;j<9;j++){ scanf("%1d",&a[i][j]); if(a[i][j]){ h[i]|=1<<a[i][j]; l[j]|=1<<a[i][j]; border[judge(i,j)]|=1<<a[i][j]; } else sum++; } return sum;}void dfs ( int m , int n , int left ){ int i,j; if ( m==9 || left==0 ) { if ( !left ) flag=true; return; } else if (a[m][n]) { if ( n==8 ) dfs(m+1,0,left); else dfs(m,n+1,left); } else { for ( i=1 ; i<10 && !flag ; i++ ) { if ( !((h[m]>>(i))&1) && !( (l[n]>>(i))&1) && !( (border[judge(m,n)]>>(i))&1) ) { h[m]|=1<<(i),l[n]|=1<<(i); border[judge(m,n)]|=1<<(i); a[m][n]=i; if ( n==8 ) dfs(m+1,0,left-1); else dfs(m,n+1,left-1); if ( !flag ) { a[m][n]=0; h[m]^=1<<(i),l[n]^=1<<(i),border[judge(m,n)]^=1<<(i); } else return; } } }}int main(){ int t; while(~scanf("%d",&t)){ while(t--){ flag=false; int all=init(); dfs(0,0,all); for(int i=0;i<9;i++){ for(int j=0;j<9;j++) printf("%d",a[i][j]); cout<<endl; } } } return 0;}
阅读全文
0 0
- POJ2676--Sudoku(搜索)
- POJ2676-搜索-Sudoku
- poj2676——Sudoku(深度搜索)
- poj2676(Sudoku)
- poj2676 - Sudoku
- POJ2676--Sudoku
- poj2676 Sudoku
- poj2676 Sudoku
- POJ2676 Sudoku
- POJ2676 Sudoku
- poj2676 Sudoku
- poj2676 Sudoku
- POJ2676-Sudoku
- poj2676--Sudoku(搜索练习5-数独游戏)
- POJ2676===sudoku===搜索
- poj2676 Sudoku 数独
- 北大ACM poj2676 Sudoku
- POJ2676:Sudoku(DFS)
- Mysql 批量插入 事务插入 性能对比
- sql多表查询分组最大值
- list容器2
- 浅谈数位DP
- 成为java高级工程师需要什么
- POJ2676-搜索-Sudoku
- C++ error:static member function cannot have cv-qualifier
- HDU
- 多线程
- Spring开发日记
- 算法入门经典
- 漫步最优化七——介绍
- java设置web首页访问action 为前台首页准备数据
- 【BZOJ—2957楼房重建】【连载:请在T台上微笑】