![](/img/trans.png)
[英]How do I fix my stack overflow error for Sudoku solver c#? Has to do with Recursive function?
[英]Stack overflow with C# and Mono, recursive function
我正在使用基于Mono框架和C#的Unity3D。 下面的函数引发堆栈溢出。 我不知道它们来自哪里。 通常在当今,这种情况只会在无限循环中发生,而在我看来并非如此。 它可以与8x8x16体素一起正常工作,但在16x16x32体素时会崩溃。 我锁上了一个锁,因为我认为在第一次完成该功能之前可能会再次触发该功能。
int FloatingVoxelsFlood(int x, int y, int z, ref bool[] voxelsAttached) {
if (GetPixel(x, y, z).a > 0.5f) return 0;
int id = GetPixelId(x, y, z);
if (voxelsAttached[id]) return 0;
voxelsAttached[id] = true;
int count = 1;
int minx = x-1;
int maxx = x+1;
if (minx >= 0)
count += FloatingVoxelsFlood(minx, y, z, ref voxelsAttached);
if (maxx < volumeWidth)
count += FloatingVoxelsFlood(maxx, y, z, ref voxelsAttached);
int miny = y-1;
int maxy = y+1;
if (miny >= 0)
count += FloatingVoxelsFlood(x, miny, z, ref voxelsAttached);
if (maxy < volumeHeight)
count += FloatingVoxelsFlood(x, maxy, z, ref voxelsAttached);
int minz = z-1;
int maxz = z+1;
if (minz >= 0)
count += FloatingVoxelsFlood(x, y, minz, ref voxelsAttached);
if (maxz < volumeDepth)
count += FloatingVoxelsFlood(x, y, maxz, ref voxelsAttached);
return count;
}
开始时将voxelsAttached设置为所有false。 如果需要使用体素,则GetPixel()。a返回。
如何解决此堆栈溢出?
下面的一个不会溢出堆栈。
int FloatingVoxelsFlood(int x, int y, int z, ref bool[] voxelsAttached) {
if (GetPixel(x, y, z).a > 0.5f) return 0;
Queue<Pixel> queue = new Queue<Pixel>();
queue.Enqueue(new Pixel(x, y, z));
int count = 0;
while(queue.Count > 0) {
Pixel p = queue.Dequeue();
int id = GetPixelId(p.x, p.y, p.z);
if (!voxelsAttached[id] && GetPixel(p.x, p.y, p.z).a < 0.5f) {
count++;
voxelsAttached[id] = true;
int minx = p.x-1;
int maxx = p.x+1;
if (minx >= 0)
queue.Enqueue(new Pixel(minx, p.y, p.z));
if (maxx < volumeWidth)
queue.Enqueue(new Pixel(maxx, p.y, p.z));
int miny = p.y-1;
int maxy = p.y+1;
if (miny >= 0)
queue.Enqueue(new Pixel(p.x, miny, p.z));
if (maxy < volumeHeight)
queue.Enqueue(new Pixel(p.x, maxy, p.z));
int minz = p.z-1;
int maxz = p.z+1;
if (minz >= 0)
queue.Enqueue(new Pixel(p.x, p.y, minz));
if (maxz < volumeDepth)
queue.Enqueue(new Pixel(p.x, p.y, maxz));
}
}
return count;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.