POJ2676 Sudoku
来源:互联网 发布:少男的喜欢lofter乐乎 编辑:程序博客网 时间:2024/05/21 18:01
http://poj.org/problem?id=2676
题目解析:
一道数独题,一开始我想用三维数组a[i][j][k],用来表示i行j列可以选的数字,如果可以就赋值为true,否则为false,可惜这样超时了,因为每填一个数字都要更新三维数组。
这道题因为测试组的原因,正向搜索比逆向搜索要慢很多,也是提醒我们,要有逆向思维;
用三个数组used1,used2,used3来表示行列和小九宫格里的状态就好了
唉
还是太年轻了,只是一个八皇后问题的变形就不会了,智商太低了啊TAT
#include<iostream>using namespace std;#include<cstdio>#include<cstring>bool ans=false;int couns=0;bool used1[10][10];bool used2[10][10];bool used3[10][10];void print(int a[][10]){ for(int i=1; i<=9; i++) { for(int j=1; j<=9; j++) { printf("%d",a[i][j]); } printf("\n"); }}int get(int i,int j){ int u; if(i>=1&&i<=3&&j>=1&&j<=3) u=1; else if(i>=4&&i<=6&&j>=1&&j<=3) u=4; else if(i>=7&&i<=9&&j>=1&&j<=3) u=7; else if(i>=1&&i<=3&&j>=4&&j<=6) u=2; else if(i>=1&&i<=3&&j>=7&&j<=9) u=3; else if(i>=4&&i<=6&&j>=4&&j<=6) u=5; else if(i>=4&&i<=6&&j>=7&&j<=9) u=6; else if(i>=7&&i<=9&&j>=7&&j<=9) u=9; else if(i>=7&&i<=9&&j>=4&&j<=6) u=8; return u;}void dfs(int c,int a[][10]){ if(ans) return ; if(c==couns) { print(a); ans=true; return ; } else { for(int i=9; i>=1; i--) for(int j=9; j>=1; j--) if(!a[i][j]) { for(int k=1; k<=9; k++) { int num=get(i,j); if(used1[i][k]||used2[j][k]||used3[num][k]) continue; a[i][j]=k; used1[i][k]=true; used2[j][k]=true; used3[num][k]=true; if(ans) return ; dfs(c+1,a); if(ans) return ; used1[i][k]=false; used2[j][k]=false; used3[num][k]=false; a[i][j]=0; } return; } }}int main(){ int T; int a[10][10]; freopen("input_poj2276.txt","r",stdin); scanf("%d",&T); while(T--) { couns=0; memset(used1,false,sizeof(used1)); memset(used2,false,sizeof(used2)); memset(used3,false,sizeof(used3)); for(int i=1; i<=9; i++) { for(int j=1; j<10; j++) { scanf("%1d",&a[i][j]); if(a[i][j]) { used1[i][a[i][j]]=true; used2[j][a[i][j]]=true; used3[get(i,j)][a[i][j]]=true; } else couns++; } } ans=false; dfs(0,a); } 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 数独
- 北大ACM poj2676 Sudoku
- POJ2676:Sudoku(DFS)
- POJ2676 Sudoku [数独]
- POJ2676:Sudoku(DFS)
- POJ2676 Sudoku DFS
- 回溯-POJ2676-Sudoku
- POJ2676 2918 Sudoku 暴搜
- KMP算法详解 转载
- Golang的反射机制(The Laws of Reflection)
- 日经春秋 20151029
- 记录利用ettercap进行简单的arp欺骗和mitm攻击过程
- android studio使用jcenter上的开源库
- POJ2676 Sudoku
- Yii2.0 search 搜索类
- AddressBookUI
- hdu--3790
- 爱生活
- java IO 字节编码
- 数位DP-HDU-3555-Bomb
- c语言中认识指针
- 使用WPR和WPA分析线程等待(分析锁的影响)