标签:
#include <stdlib.h> #include <stdio.h> #define MAX_LEN 9 int sudoku[MAX_LEN][MAX_LEN] = { {5, 3, 0, 0, 7, 0, 0, 0, 0}, {6, 0, 0, 1, 9, 5, 0, 0, 0}, {0, 9, 8, 0, 0, 0, 0, 6, 0}, {8, 0, 0, 0, 6, 0, 0, 0, 3}, {4, 0, 0, 8, 0, 3, 0, 0, 1}, {7, 0, 0, 0, 2, 0, 0, 0, 6}, {0, 6, 0, 0, 0, 0, 2, 8, 0}, {0, 0, 0, 4, 1, 9, 0, 0, 5}, {0, 0, 0, 0, 8, 0, 0, 7, 9}, }; bool checkNum(int num, int col, int row) { int i; int j; if (num<1 || num>9) { return false; } for (i=0; i<MAX_LEN; i++) { /*检查行*/ if ((i!=col) && sudoku[i][row]==num) { return false; } /*检查列*/ if ((i!=row) && sudoku[col][i]==num) { return false; } } /*检查九宫格*/ for (i=0; i<3; i++) { for (j=0; j<3; j++) { /*这个地方是或关系*/ if ((((col/3)*3+i!=col)||((row/3)*3+j!=row)) && sudoku[(col/3)*3+i][(row/3)*3+j]==num) { return false; } } } return true; } bool solveSudoku() { int i; int j; int s; /*问题: 1、必须从0开始,如果从上次的开始遍历,有问题 2、回溯,必须重新置0 */ for (i=0; i<MAX_LEN; i++) { for (j=0; j<MAX_LEN; j++) { /*当前位置有数,跳过*/ if (sudoku[i][j] != 0) { continue; } /*检查可以填充的数*/ for (s=1; s<=9; s++) { /*找到后,填充,尝试求解*/ sudoku[i][j] = s; if(checkNum(s, i, j) && solveSudoku()) { return true; } sudoku[i][j] = 0; } return false; } } return true; } int main() { int i; int j; bool flag = solveSudoku(); for (i=0; i<MAX_LEN; i++) { for (j=0; j<MAX_LEN; j++) { printf("%d ", sudoku[i][j]); } printf("\n"); } if (flag) { printf("TRUE\n"); } return 0; }
标签:
原文地址:http://blog.csdn.net/yuanwei1314/article/details/43735071