- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的问题,对于一个练习,我需要通过在回溯中暴力破解它来生成魔方。
我认为将矩阵分配为 vector 和更改坐标的函数可能很有用。你可以想象,即使使用 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];
}
谷歌搜索后我发现,对于奇数,有一种算法可以轻松生成它,但对于偶数,问题仍然存在(此外,我的教授希望通过暴力递归来实现)。
有什么可能的解决方案吗?
最佳答案
这是家庭作业,所以我不会修复你的代码...但是我会为你做一些分析来向你展示问题。仅供引用:您确实应该学习使用调试器并跟踪代码。
<小时/>这里的大问题是你的“递归”逻辑只是在两个 block 之间来回反弹,没有“最低步骤”,因此你用太多函数调用填充缓冲区并导致堆栈溢出:
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); <--- 'Recursive' step
所以当你调用这个函数时,你有m* ==你的内存块
,n == 3
和pos == 8
( 3*3-1)。
我将“递归”放在引号中,因为您没有执行递减步骤,每次使用相同的参数一遍又一遍地调用 generate_magic()
时,此代码都会运行(n
始终为 3,pos
始终为 8)
经过几次迭代后,m[pos]
将从 1 增加到 9,现在如果检查失败,我们会跳到下一个 block :
if(m[pos]==n*n)
{
if(back_f==0)
{
return;
}
m[pos]=1;
generate_magic(m, n, pos-1); <- 'Recursive' step
现在我们将代码集 m[pos] 从之前的值 (9) 输入到我们开始的值 (1),然后执行“递归”步骤,调用 generate_magic()
值为 (n==3
、pos=7
和 m[pos]==1
)
好的,所以这次我们用不同的值重新开始,对吗?我们第一次:
n == 3
和 pos == 8
现在我们有:n == 3
和 pos == 7
哎呀,但是当我们再次执行第一个“递归”调用时会发生什么?
generate_magic(m, n, n*n-1);
这会将我们的下一个条目重置为:
n == 3
和 pos == 8
这一切进展很快。迟早所有这些函数/参数压入堆栈都会杀死我们,因为我们进入了无限循环。
<小时/>旁注:
malloc(n*n*sizeof(int*));
您需要 sizeof(int)
,而不是 sizeof(int*)
,因为您的矩阵中是字符串 int
,而不是指针到int
s。
关于c - 暴力破解幻方时出现堆栈溢出错误。有什么可能的解决办法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16419584/
GCC 可见性功能使我们能够去除共享库中我们不希望客户看到的那些 API。事实上我们不能使用 ldopen 来调用那些隐藏函数,但我想知道这是否足够安全以保护我们敏感的 API。 我只想得到一些关于共
这个问题在这里已经有了答案: C# Structs "this = ...." (2 个答案) Assignment of a struct value to this keyword (2 个答案
下面一段代码给大家介绍python破解geetest 验证码功能,具体代码如下所示: ?
默认的 WordPress 类别小部件不允许排除命名类别。 我创建了一个插件,该插件将自定义类别小部件添加到“可用小部件”列表中,这使我可以对要排除的项目进行一些控制。代码如下... 但是,我希望生
有一些语言支持足够强大的类型系统,它们可以在编译时证明代码不会在其边界之外寻址数组。我的问题是,如果我们要将这样的语言编译到 JVM,是否有某种方法可以利用它来提高性能并删除每次访问数组时发生的数组边
此时,毫无疑问,由于浏览器限制,在 TinyMCE 中右键单击粘贴是不可能的(除非用户专门启用它)。 但是,是否有任何解决方法,例如使用 JavaScript 捕获粘贴事件,将剪贴板内容粘贴到某个隐藏
我是 Angular JS 新手,找不到此问题的解决方案。我必须使用用 Angular 1.4 编写的在线 Web 表单(我无法控制),并且我想注入(inject)一些 JavaScript 来更改字
我正在考虑一种以 Oracle 不希望的方式使用物化 View 日志的解决方案。这个想法是为 Oracle 源和非 Oracle 目标实现快速刷新 MV 功能。我已经测试了这种方法以确认它有效,但我担
我需要更改几个 FIT 图像标题中的一些值以适合我拥有的一些测试数据。因此,我正在尝试立即破解 FIT 图像标题以与应用程序一起运行。 然而此刻 - 我什至看不到标题,别介意破解它。我运行 Ubunt
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我已经完成了我的网站制作,但后来我在 IE8 中加载了它。大问题!例如,我的一堆 div 和 span 元素似乎是透明的(它们应该有彩色背景),并且 float 元素不起作用。 当我开发我的网站时,我
纯粹的好奇心,不用于生产,因为显然它可能会导致重大问题。 对于 C++,当您分配新内存 (var *ch = new char[x]) 时,大小基本上存储在 ch[-1] 中,根据C++ 规范。 问题
能否请您提出解决 IE8 背景大小问题的最佳方法? 最佳答案 您可以引用background-size的“跨浏览器”解决方案。 据我所知,按照THIS TUTORIAL link即可实现,因为您没有代
我试图理解 gc,因为我在一个程序中有一个很大的列表,我需要删除它以释放一些急需的内存。我想回答的基本问题是我如何找到 gc 正在跟踪的内容以及已释放的内容?以下是说明我的问题的代码 import g
我们在 iOS 应用商店上有一个成功的应用程序内购买应用程序。每次购买完成时,我们都会将收据发送到我们的服务器,然后我们的服务器会使用 Apple 的服务器检查收据并记录苹果的响应(包括购买是否有效以
我正在尝试了解 Node 的内部工作原理,但我无法拼凑出用 js 编写的 Node 如何 Hook /绑定(bind)到用 C/C++ 编写的低级系统调用。 当我写这段代码时—— var http =
我的应用程序中有这个线程监视一组客户端套接字。我使用 select() 进行阻塞,直到客户端发出请求,这样我就可以在不增加线程的情况下高效地处理它。 现在,问题是,当我将新客户端添加到客户端列表时,我
我只做个简单的小例子,给大家一个思路,吼吼~~~~ 1使用工具 Reflector.exe 用来查看.net代码 这个就不用多说了它是学.net必备神器 Ildasm.exe:用来将dll,e
我正在创建一个基于 NSDocument 的应用程序,其中包含文档选项卡。我发现它并不是为此而设计的。 Apple 设计的架构允许单个文档使用多个窗口,但反之则不然。我基本上可以正常工作,但我开始遇到
我有这段 C 代码,我想知道是否可能如何绕过此检查? int fd, password, input; fd = open("/dev/urandom", 0); read(fd, &password
我是一名优秀的程序员,十分优秀!