From 5a2017020dc6f2ed4f4f208cf2f76af1f8768fab Mon Sep 17 00:00:00 2001 From: pa37f2lwq Date: Mon, 6 Nov 2023 22:06:42 +0800 Subject: [PATCH] Update README.md --- README.md | 322 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 322 insertions(+) diff --git a/README.md b/README.md index 8b13789..fdb3422 100644 --- a/README.md +++ b/README.md @@ -1 +1,323 @@ +声明:本次实验中自行定义了头文件: +Rand_init.h +#pragma once + +#ifndef RAND_INIT_H +#define RAND_INIT_H + // !RAND_INIT_H + +void Rand_init(int in[][10]); +#endif + +STDotp.h + +#ifndef STDOTP_H +#define STDOTP_H + +void OutPut(int metric[][10]); // Function declaration + +#endif + +check.h + +#pragma once +#ifndef CHECK_H_ +#define CHECK_H_ +bool check(int A[][10]); +#endif // !CHECK_H + +1、.9*9数组格式化输出 + +【源程序】 +#include + +void Output(int metric[][10]) { +for (int i = 1; i <= 3; i++) { +printf("\n"); +for (int j = 1; j <= 3; j++) { +printf("|%d %d %d", metric[3 * i - 2][3 * j - 2], metric[3 * i - 2][3 * j - 1], metric[3 * i - 2][3 * j]); +} +printf("|\n"); +for (int j = 1; j <= 3; j++) { +printf("|%d %d %d", metric[3 * i - 1][3 * j - 2], metric[3 * i - 1][3 * j - 1], metric[3 * i - 1][3 * j]); +} +printf("|\n"); +for (int j = 1; j <= 3; j++) { +printf("|%d %d %d", metric[3 * i][3 * j - 2], metric[3 * i][3 * j - 1], metric[3 * i][3 * j]); +} +printf("|\n"); +} +printf("\n"); +} + +int main() { +int metric[10][10] = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, +{11, 12, 13, 14, 15, 16, 17, 18, 19, 20}, +{21, 22, 23, 24, 25, 26, 27, 28, 29, 30}, +{31, 32, 33, 34, 35, 36, 37, 38, 39, 40}, +{41, 42, 43, 44, 45, 46, 47, 48, 49, 50}, +{51, 52, 53, 54, 55, 56, 57, 58, 59, 60}, +{61, 62, 63, 64, 65, 66, 67, 68, 69, 70}, +{71, 72, 73, 74, 75, 76, 77, 78, 79, 80}, +{81, 82, 83, 84, 85, 86, 87, 88, 89, 90}, +{91, 92, 93, 94, 95, 96, 97, 98, 99, 100}}; + +Output(metric); + +return 0; +} + +【运行结果】 + + + + + + +2) + +【源程序】 +#include +#include +#include + +void Rand_init(int in[][10]) { +srand(time(NULL)); +for (int i = 1; i <= 9; i++) { +int nloc[10] = { 0 }; +for (int j = 1; j <= 3; j++) { +int n = rand() % 10; +int loc = rand() % 10; +while (in[i][loc] != 0 || nloc[n] == 1 || n == 0 || loc == 0) { +loc = rand() % 10; +n = rand() % 10; +} +in[i][loc] = n; +nloc[n] = 1; +} +} +} + +void Output(int metric[][10]) { +for (int i = 1; i <= 3; i++) { +printf("\n"); +for (int j = 1; j <= 3; j++) { +printf("|%d %d %d", metric[3 * i - 2][3 * j - 2], metric[3 * i - 2][3 * j - 1], metric[3 * i - 2][3 * j]); +} +printf("|\n"); +for (int j = 1; j <= 3; j++) { +printf("|%d %d %d", metric[3 * i - 1][3 * j - 2], metric[3 * i - 1][3 * j - 1], metric[3 * i - 1][3 * j]); +} +printf("|\n"); +for (int j = 1; j <= 3; j++) { +printf("|%d %d %d", metric[3 * i][3 * j - 2], metric[3 * i][3 * j - 1], metric[3 * i][3 * j]); +} +printf("|\n"); +} +printf("\n"); +} + +int main() { +int metric[10][10] = { 0 }; + +Rand_init(metric); +Output(metric); + +return 0; +} + + + +【运行结果】 + + + + + +3) + +【源程序】 +#include"Rand_init.h" +#include"STDotp.h" +#include +#include +#include + +void check(int A[][10]) { + int row[10][10] = { 0 }; + int col[10][10] = { 0 }; + int block[4][4][10] = { 0 }; + for (int i = 1; i <= 9; i++) { + for (int j = 1; j <= 9; j++) { + if (A[i][j] != 0) { + int k = A[i][j]; + if (row[i][k] != 0 || col[j][k] != 0 || block[(i + 2) / 3][(j + 2) / 3][k] != 0) { + printf("%d %d %d", i, j, k); + if (row[i][k] != 0) { printf("\nrow\n"); } + if (col[j][k] != 0) { printf("\ncol\n"); } + if (block[(i + 2) / 3][(j + 2) / 3][k] != 0) { printf("\nblock\n"); } + printf("false"); + return; + } + else { + row[i][k]++; + col[j][k]++; + block[i / 3][j / 3][k]++; + } + } + } + } +} + +void Rand_init(int in[][10]) { + srand(time(NULL)); + for (int i = 1; i <= 9; i++) { + int nloc[10] = { 0 }; + for (int j = 1; j <= 3; j++) { + int n = rand() % 10; + int loc = rand() % 10; + while (in[i][loc] != 0 || nloc[n] == 1 || n == 0 || loc == 0) { + loc = rand() % 10; + n = rand() % 10; + } + in[i][loc] = n; + nloc[n] = 1; + } + } +} + +void Output(int metric[][10]) { + for (int i = 1; i <= 3; i++) { + printf("\n"); + for (int j = 1; j <= 3; j++) { + printf("|%d %d %d", metric[3 * i - 2][3 * j - 2], metric[3 * i - 2][3 * j - 1], metric[3 * i - 2][3 * j]); + } + printf("|\n"); + for (int j = 1; j <= 3; j++) { + printf("|%d %d %d", metric[3 * i - 1][3 * j - 2], metric[3 * i - 1][3 * j - 1], metric[3 * i - 1][3 * j]); + } + printf("|\n"); + for (int j = 1; j <= 3; j++) { + printf("|%d %d %d", metric[3 * i][3 * j - 2], metric[3 * i][3 * j - 1], metric[3 * i][3 * j]); + } + printf("|\n"); + } + printf("\n"); +} + +int main() { + int A[10][10] = { 0 }; + Rand_init(A); + Output(A); + check(A); + return 0; +} + +【运行结果】 + + + + + +4) + +【源程序】 +#include +#include +#include"check.h" +#include"STDotp.h" + +bool isSafe(int A[][10], int row, int col, int num) { + // 检查行和列是否有重复的数字 + for (int i = 1; i < 10; ++i) { + if (A[row][i] == num || A[i][col] == num) { + return false; + } + } + + // 检查3x3子网格是否有重复的数字 + int startRow = row - (row-1) % 3; + int startCol = col - (col-1) % 3; + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + if (A[startRow + i][startCol + j] == num) { + return false; + } + } + } + + return true; +} + +bool solveSudoku(int A[][10]) { + for (int row = 1; row < 10; ++row) { + for (int col = 1; col < 10; ++col) { + if (A[row][col] == 0) { // 0 表示未填充的位置 + for (int num = 1; num <= 9; ++num) { + if (isSafe(A,row,col,num)) { + A[row][col] = num; + if (solveSudoku(A)) { + return true; + } + A[row][col] = 0; + } + } + // 回溯,撤销之前 + return false; // 无法填充有效数字 + } + } + } + return true; // 所有位置都已填充 +} + +void Output(int metric[][10]) { + for (int i = 1; i <= 3; i++) { + printf("\n"); + for (int j = 1; j <= 3; j++) { + printf("|%d %d %d", metric[3 * i - 2][3 * j - 2], metric[3 * i - 2][3 * j - 1], metric[3 * i - 2][3 * j]); + } + printf("|\n"); + for (int j = 1; j <= 3; j++) { + printf("|%d %d %d", metric[3 * i - 1][3 * j - 2], metric[3 * i - 1][3 * j - 1], metric[3 * i - 1][3 * j]); + } + printf("|\n"); + for (int j = 1; j <= 3; j++) { + printf("|%d %d %d", metric[3 * i][3 * j - 2], metric[3 * i][3 * j - 1], metric[3 * i][3 * j]); + } + printf("|\n"); + } + printf("\n"); +} + +int main() { + int A[10][10] = { + {0,0,0,0,0,0,0,0,0,0}, + {0,5, 3, 0, 0, 7, 0, 0, 0, 0}, + {0,6, 0, 0, 1, 9, 5, 0, 0, 0}, + {0,0, 9, 8, 0, 0, 0, 0, 6, 0}, + {0,8, 0, 0, 0, 6, 0, 0, 0, 3}, + {0,4, 0, 0, 8, 0, 3, 0, 0, 1}, + {0,7, 0, 0, 0, 2, 0, 0, 0, 6}, + {0,0, 6, 0, 0, 0, 0, 2, 8, 0}, + {0,0, 0, 0, 4, 1, 9, 0, 0, 5}, + {0,0, 0, 0, 0, 8, 0, 0, 7, 9} + }; + + if (solveSudoku(A)) { + printf("解决的数独\n"); + Output(A); + } + else { + printf("无解的数独\n"); + Output(A); + } + + return 0; +} + + + +【运行结果】 + +