Sicily 1162 Sudoku

2658 ワード

数独、直接深く探せばいい.
#include <stdio.h>
#include <string.h>
#include <memory.h>
int t;
int data[12][12];
int row [12][12];
int col[12][12];
int square[12][12];
int x[90];
int y[90];
char num;
int ctr,flag;
int get_square_num(int i,int j) {
    if (i>=1&&i<=3) {
        if (j>=1&&j<=3)
            return 1;
        else if (j>=4&&j<=6)
            return 2;
        else
            return 3;
    }
    else if (i>=4&&i<=6) {
        if (j>=1&&j<=3)
            return 4;
        else if (j>=4&&j<=6)
            return 5;
        else
            return 6;
    }
    else {
        if (j>=1&&j<=3)
            return 7;
        else if (j>=4&&j<=6)
            return 8;
        else
            return 9;
    }
}
void DFS(int p) {
    int temp,i,j,m;
    if (flag==1)
        return;
    if (p==ctr) {
        flag=1;
        return;
    }
    i=x[p];
    j=y[p];
    temp=get_square_num(i,j);
//  printf("%d %d %d
",i,j,temp); for (m=1;m<=9;m++) { if (row[i][m]==0&&col[j][m]==0&&square[temp][m]==0) { data[i][j]=m; row[i][m]=1; col[j][m]=1; square[temp][m]=1; DFS(p+1); if (flag==1)/*´Ë´¦²»´óÀí½â£¬ÐèҪעÒâ*/ return; // data[i][j]=0; row[i][m]=0; col[j][m]=0; square[temp][m]=0; } } } int main() { int i,j,temp; scanf("%d",&t); getchar(); while (t--) { ctr=0; flag=0; memset(row,0,sizeof(row)); memset(col,0,sizeof(col)); memset(square,0,sizeof(square)); for (i=1;i<=9;i++) { for (j=1;j<=9;j++) { scanf("%c",&num); data[i][j]=num-'0'; if (data[i][j]==0) { x[ctr]=i; y[ctr]=j; ctr++; } else { // printf("888888888
"); temp=get_square_num(i,j); row[i][data[i][j]]=1; col[j][data[i][j]]=1; square[temp][data[i][j]]=1; } } getchar(); } DFS(0); for (i=1;i<=9;i++) { for (j=1;j<=9;j++) { printf("%d",data[i][j]); } printf("
"); } } return 0; }