1. 程式人生 > >簡易數獨(9*9)

簡易數獨(9*9)

題目來源http://acm.nyist.net/JudgeOnline/problem.php?pid=722
【題意】
數獨遊戲,含0的位置被填入1~9的數字之後,使得每一行每一列的數字都不一樣。
【思路】
模板,不過在找到確定值之後,就要一直return,不然會超時。
【程式碼】

#include<map>
#include<stack>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream> #include<string> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long LL; int a[9][9]; int flag; bool check(int x,int y) { for(int i=0; i<9; i++) if(i!=x&&a[i][y]==a[x][y]||i!=y&&a[x][i]==a[x][y]) return
0; int fx=x/3*3; int fy=y/3*3; for(int i=fx; i<fx+3; i++) { for(int j=fy; j<fy+3; j++) { if(i!=x&&j!=y&&a[i][j]==a[x][y]) return 0; } } return 1; } void dfs(int k) { if(k==81) { for(int i=0; i<9
; i++) { printf("%d",a[i][0]); for(int j=1; j<9; j++) { printf(" %d",a[i][j]); } printf("\n"); } flag=1;//標記已找到。 return ; } int x=k/9; int y=k%9; if(!a[x][y]) { for(int i=1; i<=9; i++) { a[x][y]=i; if(check(x,y)) dfs(k+1); if(flag) return; a[x][y]=0; } } else { dfs(k+1); if(flag) return; } } int main() { int T; scanf("%d",&T); while(T--) { for(int i=0; i<9; i++) { for(int j=0; j<9; j++) { scanf("%d",&a[i][j]); } } flag=0; dfs(0); } }