繁体   English   中英

在 C 中使用递归求解幻方

[英]Solving a magic square using recursion in C

嗨,我想使用具有recursivity backtracking (如 4 个皇后练习)在C制作一个 3 x 3 幻方。

另外,我必须输入这个幻方里面的最大值,例如,如果我输入 m = 26,我的表格应该是这样的:

[22,8,21]
[16,17,18]
[13,26,12]

因为它应该通过backtracking来完成,这是许多可能的解决方案,目前我有一个简单的 3 个循环代码,通过输入 M 的值来执行所有可能的组合。

附上代码:

#include <stdio.h>
#include <string.h>
#define N 10

void print (int * num, int n)
{
    int i;
    for (i = 0; i <n; i ++)
        printf ("% d", num [i]);
    printf ("\ n");
}

int main ()
{
    int num [N];
    int * ptr;
    int temp;
    int i, m, j;
    int n = 3;
    printf ("\ nlimite:");
        scanf ("% d", & m);
    for (int i = 1; i <= m; ++ i)
    {
        for (int j = 1; j <= m; ++ j)
        {
            for (int k = 1; k <= m; ++ k)
            {
                permutations ++;
                printf ("%i,%i,%i\n", i, j, k);
            }
        }
    }
}

如何将此代码转换为递归? 并且不重复第一个值,例如 [1,1,1] [16,16,16] 因为这将允许我创建可能的行和列来详细说明幻方。

最后能够打印所有可能的正确解决方案。

solution 1     solution N
[4,9,2]        [22,8,21]
[3,5,7]        [16,17,18]
[8,1,6]   ...  [13,26,12]

对于编译,我在windows上使用MingGW - gcc ,在此先非常感谢您的帮助

因此,在您当前的代码中没有任何地方实际测试解决方案是否是一个完美的正方形。 让我们纠正一下。

现在这个解决方案真的很慢,但它确实展示了如何在此类问题中递归推进。

#include <stdio.h>

void magic_square(int *grid, int next_slot, int max_value) {
  // Maybe recurse
  if (next_slot < 9) {
    for (int i = 1; i < max_value; i++) {
      grid[next_slot] = i;
      magic_square(grid, next_slot + 1, max_value);
    }
  // Test magic square.
  } else {
    const int sum = grid[0] + grid[1] + grid[2];
    // Horizontal lines
    if (grid[3] + grid[4] + grid[5] != sum) return;
    if (grid[6] + grid[7] + grid[8] != sum) return;
    // Vertical lines
    if (grid[0] + grid[3] + grid[6] != sum) return;
    if (grid[1] + grid[4] + grid[7] != sum) return;
    if (grid[2] + grid[5] + grid[8] != sum) return;
    // Diagonal lines
    if (grid[0] + grid[4] + grid[8] != sum) return;
    if (grid[2] + grid[4] + grid[6] != sum) return;
    // Guess it works
    printf("%3d %3d %3d\n%3d %3d %3d\n%3d %3d %3d\n\n",
          grid[0], grid[1], grid[2],
          grid[3], grid[4], grid[5],
          grid[6], grid[7], grid[8]);
  }
}

int main(void) {
  int grid[9];
  int max_value = 5;
  magic_square(grid, 0, max_value);
}

您还需要添加不能多次使用数字的限制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM