|
|
2 years ago | |
|---|---|---|
| README.md | 2 years ago | |
README.md
第一题 #include<stdio.h> int main() { char board[9][9] = { {'5', '3', '4', '6', '7', '8', '9', '1', '2'}, {'6', '7', '2', '1', '9', '5', '3', '4', '8'}, {'1', '9', '8', '3', '4', '2', '5', '6', '7'}, {'8', '5', '9', '7', '6', '1', '4', '2', '3'}, {'4', '2', '6', '8', '5', '3', '7', '9', '1'}, {'7', '1', '3', '9', '2', '4', '8', '5', '6'}, {'9', '6', '1', '5', '3', '7', '2', '8', '4'}, {'2', '8', '7', '4', '1', '9', '6', '3', '5'}, {'3', '4', '5', '2', '8', '6', '1', '7', '9'} };
for (int i = 0; i < 9; i++) { if (i % 3 == 0) { printf("-------------------------\n"); } for (int j = 0; j < 9; j++) { if (j % 3 == 0) { printf("| "); } printf("%c ", board[i][j]); if (j == 8) { printf("|\n"); } } } printf("-------------------------\n"); } 第二题 #include <stdio.h> #include <stdlib.h> #include <time.h> void shuffle(int a[], int n) { for (int i = 0; i < n; i++) { int j = rand() % n; int t = a[i]; a[i] = a[j]; a[j] = t; } }
void newSudoku(int a[][9]) { int nums[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; srand(time(NULL)); for (int i = 0; i < 9; i++) { shuffle(nums, 9); for (int j = 0; j < 9; j++) { a[i][j] = nums[j]; } } for (int i = 0; i < 9; i++) { int cnt = 0; while (cnt < 6) { int j = rand() % 9; if (a[i][j] != 0) { a[i][j] = 0; cnt++; } } } }
void printSudoku(int a[][9]) { printf("-------------------------\n"); for (int i = 0; i < 9; i++) { printf("|"); for (int j = 0; j < 9; j++) { if (a[i][j] == 0) { printf(" ."); } else { printf(" %d", a[i][j]); } if ((j + 1) % 3 == 0) { printf(" |"); } } printf("\n"); if ((i + 1) % 3 == 0) { printf("-------------------------\n"); } } } int main() { int sudoku[9][9] = {0}; newSudoku(sudoku); printSudoku(sudoku); return 0; } 第三题 #include <stdio.h> #include <stdlib.h> #include <stdbool.h>
bool checkRow(int a[][9], int i) { int used[10] = {0}; for (int j = 0; j < 9; j++) { if (a[i][j] == 0) continue; if (used[a[i][j]]) { printf("False: The number %d in the row %d has been used!\n", a[i][j], i + 1); return false; } used[a[i][j]] = 1; } return true; }
bool checkCol(int a[][9], int j) { int used[10] = {0}; for (int i = 0; i < 9; i++) { if (a[i][j] == 0) continue; if (used[a[i][j]]) { printf("False: The number %d in the col %d has been used!\n", a[i][j], j + 1); return false; } used[a[i][j]] = 1; } return true; } bool checkBox(int a[][9], int r, int c) { int used[10] = {0}; for (int i = r; i < r + 3; i++) { for (int j = c; j < c + 3; j++) { if (a[i][j] == 0) continue; if (used[a[i][j]]) { printf("False: The number %d in the block %d has been used!\n", a[i][j], r / 3 * 3 + c / 3 + 1); return false; } used[a[i][j]] = 1; } } return true; }
bool checkSudoku(int a[][9]) { for (int i = 0; i < 9; i++) { if (!checkRow(a, i)) return false; } for (int j = 0; j < 9; j++) { if (!checkCol(a, j)) return false; } for (int i = 0; i < 9; i += 3) { for (int j = 0; j < 9; j += 3) { if (!checkBox(a, i, j)) return false; } } printf("True: Valid initial Sudoku matrix!\n"); return true; } void printSudoku(int a[][9]) { printf("-------------------------\n"); for (int i = 0; i < 9; i++) { printf("|"); for (int j = 0; j < 9; j++) { if (a[i][j] == 0) { printf(" ."); } else { printf(" %d", a[i][j]); } if ((j + 1) % 3 == 0) { printf(" |"); } } printf("\n"); if ((i + 1) % 3 == 0) { printf("-------------------------\n"); } } }
int main() { int sudoku[9][9] = {0}; srand(time(NULL)); newSudoku(sudoku); printSudoku(sudoku); checkSudoku(sudoku); return 0; } 第四题 #include <stdio.h> #include <stdbool.h>
#define N 9
char board[N][N] = { {'5', '3', '.', '.', '7', '.', '.', '.', '.'}, {'6', '.', '.', '1', '9', '5', '.', '.', '.'}, {'.', '9', '8', '.', '.', '.', '.', '6', '.'}, {'8', '.', '.', '.', '6', '.', '.', '.', '3'}, {'4', '.', '.', '8', '.', '3', '.', '.', '1'}, {'7', '.', '.', '.', '2', '.', '.', '.', '6'}, {'.', '6', '.', '.', '.', '.', '2', '8', '.'}, {'.', '.', '.', '4', '1', '9', '.', '.', '5'}, {'.', '.', '.', '.', '8', '.', '.', '7', '9'} };
bool isValid(int row, int col, char num) { // 判断同行是否出现过该数字 for (int i = 0; i < N; i++) { if (board[row][i] == num) { return false; } }
// 判断同列是否出现过该数字 for (int j = 0; j < N; j++) { if (board[j][col] == num) { return false; } } int box_row = row / 3 * 3; int box_col = col / 3 * 3; for (int i = box_row; i < box_row + 3; i++) { for (int j = box_col; j < box_col + 3; j++) { if (board[i][j] == num) { return false; } } }
return true; }
bool fillSudoku() { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (board[i][j] == '.') { for (char num = '1'; num <= '9'; num++) { if (isValid(i, j, num)) { board[i][j] = num; if (fillSudoku()) { return true; } board[i][j] = '.'; } } return false; } } } return true; } void printSudoku(char board[N][N]) { printf("-------------------------\n"); for (int i = 0; i < N; i++) { if (i % 3 == 0) { printf("|-------|-------|-------|\n"); } for (int j = 0; j < N; j++) { if (j % 3 == 0) { printf("| "); } printf("%c ", board[i][j]); if (j == 8) { printf("|\n"); } } } printf("|-------|-------|-------|\n"); }
int main() { printf("The original Sudoku matrix: \n"); printSudoku(board);
if (fillSudoku()) { printf("True: Valid initial Sudoku matrix!\n"); printf("The solution of Sudoku matrix: \n"); printSudoku(board); } else { printf("False: Invalid initial Sudoku matrix!\n"); printf("No solution!\n"); } return 0; }