这是我的问题,对于一个练习,我需要通过在回溯中对其进行暴力破解来生成一个魔方。
我认为将矩阵分配为向量和更改坐标的函数可能很有用。正如您可以想象的那样,即使使用 3x3 幻方,它也给了我一个堆栈溢出问题。
调试它我发现它或多或少发生在生成的一半,更准确地说是函数chk_magic(int *m, int n)
调用的位置change_coord(i, j, m, n);
。
这是整个代码,我在其中签署了中断程序的行。
#include <stdio.h>
#include <stdlib.h>
int chk_magic(int*, int);
void generate_magic(int*, int, int);
int change_coord(int, int, int*, int);
int back_f;
int main()
{
int i, j, n=3, *m;
//printf("Inserisci la dimensione del quadrato: ");
//scanf("%d", &n);
m=malloc(n*n*sizeof(int*));
for(i=0; i<(n*n); i++)
{
m[i]=1;
}
printf("Generazione in corso (se la dimensione e' maggiore di 4 potrebbero volerci minuti)...\n");
generate_magic(m, n, n*n-1);
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("%3d ", change_coord(i, j, m, n));
}
printf("\n");
}
return 0;
}
int chk_magic(int *m, int n)
{
int i, j, magic_n, orizzontal_buffer, vertical_buffer, flag;
flag=0;
magic_n=n*(n*n + 1)/2;
for(i=0; i<n; i++)
{
orizzontal_buffer=0;
vertical_buffer=0;
for(j=0; j<n; j++)
{
orizzontal_buffer+=change_coord(i, j, m, n); // <<-- HERE! HALP!
vertical_buffer+=change_coord(j, i, m, n);
}
if(vertical_buffer!=magic_n || orizzontal_buffer!=magic_n)
{
flag=1;
return flag;
}
}
orizzontal_buffer=0;
vertical_buffer=0;
for(i=0, j=n-1; i<n; i++, j--)
{
orizzontal_buffer=change_coord(i, i, m, n);
vertical_buffer=change_coord(i, j, m, n);
}
if(vertical_buffer!=magic_n || orizzontal_buffer!=magic_n)
{
flag=1;
}
return flag;
}
void generate_magic(int *m, int n, int pos)
{
if(m[pos]<n*n)
{
m[pos]++;
back_f=chk_magic(m, n);
if(back_f==0)
{
return;
}
generate_magic(m, n, n*n-1);
return;
}
if(m[pos]==n*n)
{
if(back_f==0)
{
return;
}
m[pos]=1;
generate_magic(m, n, pos-1);
return;
}
if(pos==-1)
{
return;
}
return;
}
int change_coord(int x, int y, int *m, int dim)
{
return m[(x*dim)+y];
}
谷歌搜索我发现对于奇数有一种算法可以很容易地生成它,但是对于偶数问题仍然存在(此外,我的教授希望它具有暴力递归)。
任何可能的解决方案?