关于用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;
}
请问各位大佬这些代码有哪些地方可以化简的,或者是其他好一点的思路求解问题。 你好!这段代码的目的是求解九宫格的各个位置的数字,满足每行、每列和对角线的和为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
谢谢大佬
以后别给他最佳,他是chatgpt! kaishao 发表于 2023-7-7 12:36
谢谢大佬
同意4# 歌者文明清理员 发表于 2023-7-7 12:38
以后别给他最佳,他是chatgpt!
谢谢提醒,刚学c,他的代码一大推都看不懂,不过他的优化建议我觉得还是可以的
页:
[1]