수독구해---역귀귀, 무뇌매거판

4526 단어
 
 
 
 
#include <stdlib.h>
#include <stdio.h>


#define LENGTH 9


int answer = 0;


void printSudo(int array[][LENGTH]) {
    printf("

");     int i, j;     for (i = 0; i < LENGTH; i++) {         if ((i + 1) % 3 == 0)             printf("

");         for (j = 0; j< LENGTH; j++) {             if ((j + 1) % 3 == 0)                 printf("\t");             printf("%d  ", array[i][j]);         }         printf("
");     }     exit(0); } void initSudoArray(int array[][LENGTH]) {     int i, j;     FILE *fp;     if ((fp = fopen("sudo_input", "r")) == NULL) {         printf("File open failed !
");         exit(-1);     }     for (i = 0; i < LENGTH; i++) {         for (j = 0; j < LENGTH; j++) {             fscanf(fp, "%d", &array[i][j]);         }     }          fclose(fp); } int checkSudo(int array[][LENGTH], int i, int j, int testVal) {     int row, col;     printf("checkSudo for [%d][%d] testVal = %d
", i, j, testVal);     // fixed to col j, check for the rows     for (row = 0; row < LENGTH; row++) {         printf("check for rows! [%d][%d]  = %d
", row, j, array[row][j]);         if (array[row][j] == testVal)             return 0;     }     // fixed to row i, check for cols     for (col = 0; col < LENGTH; col++) {         printf("check for cols! [%d][%d] = %d
", i, col, array[i][col]);         if (array[i][col] == testVal)             return 0;     }     //check for the sub-square     int row_subSquare = (i / 3) * 3;     int col_subSquare = (j / 3) * 3;     printf("[%d][%d]
", row, col);     for (row = row_subSquare; row < row_subSquare + 3; row++) {         for (col = col_subSquare; col < col_subSquare + 3; col++) {             printf("check for sub-square! [%d][%d] = %d
", row, col, array[row][col]);             if (array[row][col] == testVal)                 return 0;         }     }     return 1;     } // length is the plane index of the sudo array void sudo_solve(int array[][LENGTH], int length) {     // i for rows, j for cols     int i, j;     int testVal;     int tempArray[LENGTH][LENGTH];     //dump the array to tempArray     for (i = 0; i < LENGTH; i++) {         for (j = 0; j < LENGTH; j++)             tempArray[i][j] = array[i][j];     }     i = length / LENGTH;     j = length % LENGTH;     printf("array[%d][%d] = %d", i, j, array[i][j]);     if (array[i][j] != 0) {     // there is a val in the slot array[i][j]         if (length == 80)             printSudo(tempArray);         else             sudo_solve(tempArray, length + 1);     } else {     // there is no val in the slot array[i][j]         for (testVal = 1; testVal <= LENGTH; testVal++) {             if (checkSudo(tempArray, i, j, testVal) != 0) {                 tempArray[i][j] = testVal;                 if (length == 80)                     printSudo(tempArray);                 else                      sudo_solve(tempArray, length + 1);                                  tempArray[i][j] = 0;             }         }     } } int main(void) {     int array[LENGTH][LENGTH];     initSudoArray(array);     sudo_solve(array, 0);     if (answer == 0)         printf("There is no answer for this sudo!");     return 0;  }

프로그램이 sudo를 읽을 거예요.이 sudo 게임을 초기화하기 위해 input 파일, sudo_input 파일 형식:
8    0    0      0    0    0      0    0    0

0    0    3      6    0    0      0    0    0

0    7    0      0    9    0      2    0    0


0    5    0      0    0    7      0    0    0

0    0    0      0    4    5      7    0    0

0    0    0      1    0    0      0    3    0


0    0    1      0    0    0      0    6    8

0    0    8      5    0    0      0    1    0

0    9    0      0    0    0      4    0    0 

다음 코드는 역귀구해입니다.
// there is no val in the slot array[i][j]
        for (testVal = 1; testVal <= LENGTH; testVal++) {
            if (checkSudo(tempArray, i, j, testVal) != 0) {

                tempArray[i][j] = testVal;

                if (length == 80)
                    printSudo(tempArray);
                else 
                    sudo_solve(tempArray, length + 1);
                
                tempArray[i][j] = 0;
            }
        }

좋은 웹페이지 즐겨찾기