POJ 2676 Sudoku (数独 搜索)
2013-10-12 10:01
351 查看
题目链接:http://poj.org/problem?id=2676
开始以为直接DFS会超时,没想到竟然能AC,后来想想也对,只要搜索出一个结果就行了!
开始以为直接DFS会超时,没想到竟然能AC,后来想想也对,只要搜索出一个结果就行了!
#include <string.h> #include <algorithm> #include <stdio.h> #include <iostream> using namespace std; #define maxn 11 char map[maxn][maxn]; char tem[maxn][maxn]; bool row[maxn][maxn],colum[maxn][maxn],cir[maxn][maxn],flag; int num; bool is_ok(int i,int j,int num){ return row[i][num] && colum[j][num] && cir[((i-1)/3)*3+(j-1)/3+1][num]; } int out(){ int i,j; for(i=1;i<=9;i++){ for(j=1;j<=9;j++) printf("%c",map[i][j]); printf("\n"); } } int find_ans(int i,int j,int num){ if(num<=0){ flag=true; out(); } int k=i,r; for(i;i<=9;i++){ if(i!=k) j=1; for( ;j<=9;j++){ if(!flag && map[i][j]=='0'){ for(r=1;r<=9;r++) if(is_ok(i,j,r)){ map[i][j]='0'+r; row[i][r]=colum[j][r]=cir[((i-1)/3)*3+(j-1)/3+1][r]=false; find_ans(i,j,num-1); row[i][r]=colum[j][r]=cir[((i-1)/3)*3+(j-1)/3+1][r]=true; map[i][j]='0'; } return 0; } } } } int main(){ int i,j,k,t; scanf("%d",&t); while(t--){ memset(row,1,sizeof(row)); memset(colum,1,sizeof(colum)); memset(cir,1,sizeof(cir)); num=0; flag=false; for(i=1;i<=9;i++) for(j=1;j<=9;j++){ cin>>map[i][j]; if(map[i][j]!='0'){ row[i][map[i][j]-'0']=false; colum[j][map[i][j]-'0']=false; cir[((i-1)/3)*3+(j-1)/3+1][map[i][j]-'0']=false; } else num++; } memcpy(tem,map,sizeof(tem)); find_ans(1,1,num); if(flag==false){ for(i=1;i<=9;i++){ for(j=1;j<=9;j++) printf("%c",map[i][j]); printf("\n"); } } } return 0; }
相关文章推荐
- 搜索 --- 数独求解 POJ 2676 Sudoku
- 简单搜索(数独)poj 2676 Sudoku
- 搜索 --- 数独求解 POJ 2676 Sudoku
- POJ 2676 数独 搜索
- POJ 2676 Sudoku 数独
- POJ 2676 Sudoku (数独求解器 DFS)
- POJ 2676 Sudoku (搜索,Dancing Links)
- POJ - 2676 Sudoku解题报告(解数独)
- POJ 2676 数独(基础搜索)
- POJ 2676:Sudoku 数独
- POJ 2676:Sudoku 数独
- POJ 2676-Sudoku(DFS-数独)
- poj 2676 sudoku ( 数独)----DFS
- 数独问题的介绍及POJ 2676-Sudoku(dfs+剪枝)
- poj 2676(dfs求解数独问题,对行列和格子分别加bool数组优化搜索)
- [DFS]poj 2676 Sudoku 数独问题
- poj2676——Sudoku(深度搜索)
- POJ 2676 Sudoku (数独 DFS)
- 数独 Sudoku poj 2676
- POJ 2676Sudoku(数独)