我有这个功能,显然它会导致程序崩溃:
long long todos(long long x,long long i) {
x ^= (1 << i);
long long aux = i - 1;
if(aux >= 0) x ^= (1 << aux);
aux = i - 4;
if(aux >= 0) x ^= (1 << aux);
aux = i + 1;
if(aux < 16) x ^= (1 << aux);
aux = i + 4;
if(aux < 16) x ^= (1 << aux);
return x;
}
我不明白为什么当我为^= (
更改所有&= ~(
时,它运行得非常好(尽管我得到的输出不同)。这种行为有合理的解释吗?
如果您需要整个代码:http://ideone.com/Z7qoof
答案 0 :(得分:1)
看起来您的dp()
功能非常深入。考虑到dp(3)
的调用可以使用^
按顺序评估所有65536个可能的位板,而&~
调用dp(k)
只能在k
之前以数字方式评估位板1}}。请注意,您正在mat
按顺序填写main()
;如果你只是在k
之前以数字方式依赖于位板,那么你就不会非常深刻地进行递归。
编辑:至于修复此问题,您可能会认为动态编程是有向无环图中的最短路径。麻烦的是你这里没有非循环图。你正在进行深度优先搜索,以便在这里找到最短的路径,这不会起作用。尝试用广度优先搜索或Dijkstra算法替换它。
答案 1 :(得分:0)
我的猜测是这条线崩溃了:
cout&lt;&lt; mat [bs.to_ulong()]&lt;&lt; ENDL;
由于bs大于1 <&lt; 16
的保留空间P.S。为什么要使用long long数据类型?长多是64位。你做的大多数事情都可能用短的int
完成