From f98b3371440e998192a92e17779eabd1f10d38ba Mon Sep 17 00:00:00 2001 From: lucas Date: Fri, 27 Oct 2023 23:41:58 +0800 Subject: [PATCH] refactor: Re-implement hanota.c (#885) * feat: re-impl hanota.c * chore: Remove useless comment code * Update hanota.c * Update hanota.c * Update print_util.h * Update CMakeLists.txt --------- Co-authored-by: Yudong Jin --- codes/c/CMakeLists.txt | 4 +- codes/c/chapter_divide_and_conquer/hanota.c | 84 ++++++++++----------- codes/c/utils/print_util.h | 2 +- 3 files changed, 42 insertions(+), 48 deletions(-) diff --git a/codes/c/CMakeLists.txt b/codes/c/CMakeLists.txt index 4e5a5d83e..bb5f8f6a9 100644 --- a/codes/c/CMakeLists.txt +++ b/codes/c/CMakeLists.txt @@ -8,11 +8,13 @@ include_directories(./include) add_subdirectory(chapter_computational_complexity) add_subdirectory(chapter_array_and_linkedlist) add_subdirectory(chapter_stack_and_queue) -add_subdirectory(chapter_heap) add_subdirectory(chapter_hashing) add_subdirectory(chapter_tree) +add_subdirectory(chapter_heap) add_subdirectory(chapter_graph) add_subdirectory(chapter_searching) add_subdirectory(chapter_sorting) +add_subdirectory(chapter_divide_and_conquer) add_subdirectory(chapter_backtracking) +add_subdirectory(chapter_dynamic_programming) add_subdirectory(chapter_greedy) diff --git a/codes/c/chapter_divide_and_conquer/hanota.c b/codes/c/chapter_divide_and_conquer/hanota.c index 39ab89e22..1c7d24c90 100644 --- a/codes/c/chapter_divide_and_conquer/hanota.c +++ b/codes/c/chapter_divide_and_conquer/hanota.c @@ -1,82 +1,74 @@ /** * File: hanota.c * Created Time: 2023-10-01 - * Author: Zuoxun (845242523@qq.com) + * Author: Zuoxun (845242523@qq.com), lucas(superrat6@gmail.com) */ #include "../utils/common.h" +// 假设最多有 1000 个排列 +#define MAX_SIZE 1000 + /* 移动一个圆盘 */ -void move(vector *src, vector *tar) { +void move(int *src, int *srcSize, int *tar, int *tarSize) { // 从 src 顶部拿出一个圆盘 - int *panTemp = vectorBack(src); - int *pan = malloc(sizeof(int)); - *pan = *panTemp; - vectorPopback(src); + int pan = src[*srcSize - 1]; + src[*srcSize - 1] = 0; + (*srcSize)--; // 将圆盘放入 tar 顶部 - vectorPushback(tar, pan, sizeof(int)); + tar[*tarSize] = pan; + (*tarSize)++; } /* 求解汉诺塔:问题 f(i) */ -void dfs(int i, vector *src, vector *buf, vector *tar) { +void dfs(int i, int *src, int *srcSize, int *buf, int *bufSize, int *tar, int *tarSize) { // 若 src 只剩下一个圆盘,则直接将其移到 tar if (i == 1) { - move(src, tar); + move(src, srcSize, tar, tarSize); return; } // 子问题 f(i-1) :将 src 顶部 i-1 个圆盘借助 tar 移到 buf - dfs(i - 1, src, tar, buf); + dfs(i - 1, src, srcSize, tar, tarSize, buf, bufSize); // 子问题 f(1) :将 src 剩余一个圆盘移到 tar - move(src, tar); + move(src, srcSize, tar, tarSize); // 子问题 f(i-1) :将 buf 顶部 i-1 个圆盘借助 src 移到 tar - dfs(i - 1, buf, src, tar); + dfs(i - 1, buf, bufSize, src, srcSize, tar, tarSize); } /* 求解汉诺塔 */ -void solveHanota(vector *A, vector *B, vector *C) { - int n = A->size; +void solveHanota(int *A, int *ASize, int *B, int *BSize, int *C, int *CSize) { // 将 A 顶部 n 个圆盘借助 B 移到 C - dfs(n, A, B, C); -} - -/* 打印向量中的元素 */ -void printFunc(vector *v, void *p) { - int *node = p; - printf("%d", *node); + dfs(*ASize, A, ASize, B, BSize, C, CSize); } /* Driver Code */ int main() { // 列表尾部是柱子顶部 int a[] = {5, 4, 3, 2, 1}; - vector *A = newVector(); // int - vector *B = newVector(); // int - vector *C = newVector(); // int - for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) { - vectorPushback(A, &a[i], sizeof(int)); - } + int b[MAX_SIZE] = {0}; + int c[MAX_SIZE] = {0}; - printf("初始状态下:\n"); - printf("A ="); - printVector(A, printFunc); - printf("B ="); - printVector(B, printFunc); - printf("C ="); - printVector(C, printFunc); + int ASize = sizeof(a) / sizeof(a[0]); + int BSize = 0; + int CSize = 0; - solveHanota(A, B, C); + printf("\n初始状态下:"); + printf("\nA = "); + printArray(a, ASize); + printf("B = "); + printArray(b, BSize); + printf("C = "); + printArray(c, CSize); - printf("圆盘移动完成后:\n"); - printf("A ="); - printVector(A, printFunc); - printf("B ="); - printVector(B, printFunc); - printf("C ="); - printVector(C, printFunc); + solveHanota(a, &ASize, b, &BSize, c, &CSize); + + printf("\n圆盘移动完成后:"); + printf("A = "); + printArray(a, ASize); + printf("B = "); + printArray(b, BSize); + printf("C = "); + printArray(c, CSize); - // 释放内存 - delVector(A); - delVector(B); - delVector(C); return 0; } diff --git a/codes/c/utils/print_util.h b/codes/c/utils/print_util.h index 720556c75..97d995ddd 100644 --- a/codes/c/utils/print_util.h +++ b/codes/c/utils/print_util.h @@ -35,7 +35,7 @@ static void printArray(int arr[], int size) { printf("NULL]\n"); } } else { - printf("]"); + printf("]\n"); } }