kaishao 发表于 2023-7-7 12:30:01

关于用C语言求九宫格的各个位置的数字

#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 + arr + arr != 15 ||
            arr + arr + arr != 15) {
            return false;
      }
    }

    if (arr + arr + arr != 15 || arr + arr + arr != 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);
                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 函数并检查生成的排列是否满足九宫格的条件。

这种方法的优点是它可以用于解决更复杂的问题,比如更大的九宫格。但是,它可能比原始方法要慢一些,因为它需要生成和检查更多的排列。总的来说,这种方法在易用性和可扩展性方面具有优势。

kaishao 发表于 2023-7-7 12:36:16

谢谢大佬

歌者文明清理员 发表于 2023-7-7 12:38:23

kaishao 发表于 2023-7-7 12:36
谢谢大佬

以后别给他最佳,他是chatgpt!

sfqxx 发表于 2023-7-7 12:49:32

kaishao 发表于 2023-7-7 12:36
谢谢大佬

同意4#

kaishao 发表于 2023-7-7 12:56:02

歌者文明清理员 发表于 2023-7-7 12:38
以后别给他最佳,他是chatgpt!

谢谢提醒,刚学c,他的代码一大推都看不懂,不过他的优化建议我觉得还是可以的
页: [1]
查看完整版本: 关于用C语言求九宫格的各个位置的数字