HDU 1426 Sudoku Killer
2011-09-21 21:33
309 查看
该题是一个DFS的应用,该题的关键在于建立一个结构体来存储要你填入的数据,这要就不会像无头苍蝇一样乱搜索,同时也会剪枝不少;同时就是判断横竖不能又重复的,也就是不能等于你要填入的数据,还有一点就是每个小3*3的矩阵要是1-9不能重复,这里就对该坐标x/3*3就可以了;
#include<stdio.h> #include<stdlib.h> #include<string.h> struct node { int x,y; }q[100]; int map[9][9],res,flag; bool judge( int n,int num ) { for( int i=0;i<9;i++ )//横竖判断是否重复 { if( map[q .x][i]==num||map[i][q .y]==num ) return false; } int x=q .x/3*3; int y=q .y/3*3; for( int i=0;i<3;i++ )//小矩阵的判断 { for( int j=0;j<3;j++ ) if( map[x+i][y+j]==num ) return false; } return true; } void DFS( int sum ) { if( res==sum ) { flag=1; for( int i=0; i<9; i++ ) { for( int j=0; j<9; j++ ) { printf( j==8?"%d\n":"%d ",map[i][j] ); } } return ; } else { for( int i=1;i<=9&&flag==0;i++ ) { if( judge( sum,i ) && flag==0 ) { map[q[sum].x][q[sum].y]=i; DFS( sum+1 ); map[q[sum].x][q[sum].y]=0; } } } } int main( ) { char num[2]; int Case=0; res=0; while( scanf( "%s",num )!=EOF ) { res=0; flag=0; if( num[0]!='?' ) map[0][0]=num[0]-'0'; for( int i=0;i<9;i++ ) for( int j=0;j<9;j++ ) { if( !(0==i&&j==0 ))scanf( "%s",num ); if( num[0]=='?' ) { q[res].x=i; q[res].y=j; map[i][j]=0; res++; } else { map[i][j]=num[0]-'0'; } } if( Case++ ) puts( "" ); DFS( 0 ); } return 0; }
相关文章推荐
- hdu1426 Sudoku Killer 深搜
- hdu 1426 Sudoku Killer【深度优先搜索】
- HDU 1426 Sudoku Killer【用深搜解数独】
- 【HDU 1426 Sudoku Killer】+ DFS
- HDU 1426--Sudoku Killer【DFS】
- HDU-1426(Sudoku Killer)(dfs+巧妙思维)
- HDU 1426 Sudoku Killer(dfs)
- HDU 1426 Sudoku Killer (DFS 数独)
- HDU 1426 Sudoku Killer(搜索)
- hdu 1426 Sudoku Killer
- hdu 1426 Sudoku Killer(DFS 数独问题)
- HDU 1426 Sudoku Killer (解数独) 一个令人呕吐的 代码
- HDU - 1426 Sudoku Killer(DFS)
- hdu 1426 Sudoku Killer(暴搜)
- hdu: 1426 ( Sudoku Killer )
- HDU - 1426 Sudoku Killer(回溯)
- hdu 1426:Sudoku Killer(DFS深搜,进阶题目,求数独的解)
- hdu 1426 Sudoku Killer ( Dancing Link 精确覆盖 )
- hdu-1426-Sudoku Killer(dfs)
- Problem Y:Sudoku Killer(HDU 1426)