鱼C论坛

 找回密码
 立即注册
查看: 660|回复: 5

[已解决]关于用C语言求九宫格的各个位置的数字

[复制链接]
发表于 2023-7-7 12:30:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

int main() {
/*                       (D)                 (G)
       | A           | B+C-A  |          |15-B-C    |
       |-----------------------|----------------------|                
   (I)| 15-A-C   | B          |          |A+C-B    |(H)
       |-----------------------|----------------------|             
       | C           | A+B-C  |          |15-A-B    |
                         (E)                (F)
*/

    int A, B,C,D,E,F,G,H,I;
    for (A = 1; A < 10; A++) {
        for (B = 1; B < 10; B++) {
            for (C = 1; C < 10; C++) {
                if (A != B && A != C && B != C) {
                    D = B + C - A;
                    E = A + B - C;
                    F = 15 - A - B;
                    H = A + C - B;
                    I = 15 - A - C;
                    G = 15 - B - C;
                    if (D!=E&&D!=F&&D!=H&&D!=I&&D!=G&&E!=F&&E!=H&&E!=I&&E!=G&&F!=H&&F!=I&&F!=G&&H!=I&&H!=G&&I!=G&&D>0&&E>0&&F>0&&H>0&&I>0&&G>0&&A + B + F == 15 && A + D + G == 15 && A + I + C == 15 && D + B + E == 15 && G + H + F == 15 && C + B + G == 15 && I + B + H == 15 && C + E + F == 15) {

                        printf("%d %d %d %d %d %d %d %d %d\n", A, D, G, I, B, H, C, E, F);
                    }
                    else {
                        continue;
                    }


                }

            }
        }
    }


    return 0;
}


请问各位大佬这些代码有哪些地方可以化简的,或者是其他好一点的思路求解问题。
最佳答案
2023-7-7 12:32:13
你好!这段代码的目的是求解九宫格的各个位置的数字,满足每行、每列和对角线的和为15。我会给出一些建议来优化代码,以及提供另一种求解思路。

首先,我们可以优化一下代码风格,使其更易读:
#include <stdio.h>int main() {    int A, B, C, D, E, F, G, H, I;    for (A = 1; A < 10; A++) {        for (B = 1; B < 10; B++) {            for (C = 1; C < 10; C++) {                if (A != B && A != C && B != C) {                    D = B + C - A;                    E = A + B - C;                    F = 15 - A - B;                    H = A + C - B;                    I = 15 - A - C;                    G = 15 - B - C;                    if (D > 0 && E > 0 && F > 0 && H > 0 && I > 0 && G > 0 &&                        D != E && D != F && D != H && D != I && D != G &&                        E != F && E != H && E != I && E != G &&                        F != H && F != I && F != G &&                        H != I && H != G &&                        I != G &&                        A + B + F == 15 && A + D + G == 15 && A + I + C == 15 &&                        D + B + E == 15 && G + H + F == 15 && C + B + G == 15 &&                        I + B + H == 15 && C + E + F == 15) {                        printf("%d %d %d %d %d %d %d %d %d\n", A, D, G, I, B, H, C, E, F);                    }                }            }        }    }    return 0;}
关于优化方案,我们可以利用九宫格的行、列和对角线的和是相等的这一特性,减少重复计算。例如,我们可以在循环中计算D、E、F、H和I的值,而不是在每次循环中计算它们。但是,由于A、B和C的值在循环中改变,我们无法在循环之外计算G的值。

另一个求解思路是利用排列组合的方法。我们可以生成1到9的所有排列,然后检查每个排列是否满足九宫格的条件。这是一个示例代码:
#include <stdio.h>#include <stdbool.h>#include <stdlib.h>bool is_magic_square(int *arr) {    for (int i = 0; i < 3; i++) {        if (arr[3*i] + arr[3*i+1] + arr[3*i+2] != 15 ||            arr[i] + arr[i+3] + arr[i+6] != 15) {            return false;        }    }    if (arr[0] + arr[4] + arr[8] != 15 || arr[2] + arr[4] + arr[6] != 15) {        return false;    }    return true;}void swap(int *x, int *y) {    int temp = *x;    *x = *y;    *y = temp;}void permute(int *arr, int start, int end) {    if (start == end) {        if (is_magic_square(arr)) {            for (int i = 0; i < 9; i++) {                printf("%d ", arr[i]);                if ((i + 1) % 3 == 0) {                    printf("\n");                }            }            printf("\n");        }    } else {        for (int i = start; i <= end; i++) {            swap((arr+start), (arr+i));            permute(arr, start+1, end);            swap((arr+start), (arr+i)); // backtrack        }    }}int main() {    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};    permute(arr, 0, 8);    return 0;}
这个代码首先定义了一个 is_magic_square 函数,用于检查一个给定的排列是否满足九宫格的条件。然后,我们定义了一个 swap 函数用于交换数组中的元素,以及一个 permute 函数用于生成所有可能的排列。最后,在 main 函数中,我们调用 permute 函数并检查生成的排列是否满足九宫格的条件。

这种方法的优点是它可以用于解决更复杂的问题,比如更大的九宫格。但是,它可能比原始方法要慢一些,因为它需要生成和检查更多的排列。总的来说,这种方法在易用性和可扩展性方面具有优势。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 12:32:13 | 显示全部楼层    本楼为最佳答案   
你好!这段代码的目的是求解九宫格的各个位置的数字,满足每行、每列和对角线的和为15。我会给出一些建议来优化代码,以及提供另一种求解思路。

首先,我们可以优化一下代码风格,使其更易读:
#include <stdio.h>int main() {    int A, B, C, D, E, F, G, H, I;    for (A = 1; A < 10; A++) {        for (B = 1; B < 10; B++) {            for (C = 1; C < 10; C++) {                if (A != B && A != C && B != C) {                    D = B + C - A;                    E = A + B - C;                    F = 15 - A - B;                    H = A + C - B;                    I = 15 - A - C;                    G = 15 - B - C;                    if (D > 0 && E > 0 && F > 0 && H > 0 && I > 0 && G > 0 &&                        D != E && D != F && D != H && D != I && D != G &&                        E != F && E != H && E != I && E != G &&                        F != H && F != I && F != G &&                        H != I && H != G &&                        I != G &&                        A + B + F == 15 && A + D + G == 15 && A + I + C == 15 &&                        D + B + E == 15 && G + H + F == 15 && C + B + G == 15 &&                        I + B + H == 15 && C + E + F == 15) {                        printf("%d %d %d %d %d %d %d %d %d\n", A, D, G, I, B, H, C, E, F);                    }                }            }        }    }    return 0;}
关于优化方案,我们可以利用九宫格的行、列和对角线的和是相等的这一特性,减少重复计算。例如,我们可以在循环中计算D、E、F、H和I的值,而不是在每次循环中计算它们。但是,由于A、B和C的值在循环中改变,我们无法在循环之外计算G的值。

另一个求解思路是利用排列组合的方法。我们可以生成1到9的所有排列,然后检查每个排列是否满足九宫格的条件。这是一个示例代码:
#include <stdio.h>#include <stdbool.h>#include <stdlib.h>bool is_magic_square(int *arr) {    for (int i = 0; i < 3; i++) {        if (arr[3*i] + arr[3*i+1] + arr[3*i+2] != 15 ||            arr[i] + arr[i+3] + arr[i+6] != 15) {            return false;        }    }    if (arr[0] + arr[4] + arr[8] != 15 || arr[2] + arr[4] + arr[6] != 15) {        return false;    }    return true;}void swap(int *x, int *y) {    int temp = *x;    *x = *y;    *y = temp;}void permute(int *arr, int start, int end) {    if (start == end) {        if (is_magic_square(arr)) {            for (int i = 0; i < 9; i++) {                printf("%d ", arr[i]);                if ((i + 1) % 3 == 0) {                    printf("\n");                }            }            printf("\n");        }    } else {        for (int i = start; i <= end; i++) {            swap((arr+start), (arr+i));            permute(arr, start+1, end);            swap((arr+start), (arr+i)); // backtrack        }    }}int main() {    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};    permute(arr, 0, 8);    return 0;}
这个代码首先定义了一个 is_magic_square 函数,用于检查一个给定的排列是否满足九宫格的条件。然后,我们定义了一个 swap 函数用于交换数组中的元素,以及一个 permute 函数用于生成所有可能的排列。最后,在 main 函数中,我们调用 permute 函数并检查生成的排列是否满足九宫格的条件。

这种方法的优点是它可以用于解决更复杂的问题,比如更大的九宫格。但是,它可能比原始方法要慢一些,因为它需要生成和检查更多的排列。总的来说,这种方法在易用性和可扩展性方面具有优势。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-7 12:36:16 From FishC Mobile | 显示全部楼层
谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-7 12:38:23 | 显示全部楼层

以后别给他最佳,他是chatgpt!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-7 12:49:32 | 显示全部楼层

同意4#
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-7 12:56:02 | 显示全部楼层
歌者文明清理员 发表于 2023-7-7 12:38
以后别给他最佳,他是chatgpt!

谢谢提醒,刚学c,他的代码一大推都看不懂,不过他的优化建议我觉得还是可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 08:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表