好的,让我先说一下,我的教授向我们抛出了一个项目,我认为我们还没有准备好接受这个项目。然而,我必须建立一个5连排的游戏,这是“聪明”的。因此,我首先让程序使用以下命令向用户询问电路板的尺寸:
https://gist.github.com/2307257
现在由于这个游戏中的棋盘很大,我想有一个算法来对棋盘上的空间进行排序,这样计算机就可以尝试控制棋盘的中间位置。例如,在5x5电路板上,这些值为:
1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1
在这种情况下,计算机将选择棋盘的中间(值3)。作为一个彻头彻尾的菜鸟,我在做这件事上有些困难。我一直在想,我可以用一些循环来做这件事,因为我相信板上任何点的值都应该是: array (min width + i) do (max width - i) =1+i,对吗?嗯,我一直在尝试使用这样的东西:
https://gist.github.com/2307327
但它当然不能工作,否则我就不会在这里了。所以请帮我解决这个问题。谢谢
发布于 2012-04-21 01:31:45
该代码将导致缓冲区溢出,因为长度/大小为5的数组将具有从0到4的索引。
当y等于高度时,第27行将导致崩溃,因为您将导致数组边界之外的写入。当x等于width而y小于height时,您将写入数组单元。
你的循环应该是...for (y = 0;y
如果您想要填充如上所示的数组,则忽略了y方向。你可以简化。
#define MIN(A, B) (((A) < (B)) ? A : B)
// x or y is cell 0 to 4 then the cell value should x or y + 1
// x or y is close to the other edge then the cell value should be width - x, or height - y
// I'm assuming that if the playing field is larger than 9x9 then a cell value of 5 is
// good enough.
array[x][y] =
MIN(
5,
MIN(
MIN(x + 1, width - x),
MIN(y + 1, height - y)));
我看你是想聪明一点,因为你意识到27行的结果是对称的。但是,如果这样做,那么您应该更改for循环,以迭代宽度(最终是高度)的“一半”。否则,您将覆盖已计算的单元格。简而言之,这是一种优化。一些你应该在最后做的事情,在你得到一些工作之后。
通常,做一些简单和容易理解的事情在速度方面就“足够好”了,优化可能不是必要的。在这种情况下,你需要一台20世纪70年代的超级慢机器,才能让大脑死亡简单算法看起来很慢。
一些挑剔..。
https://stackoverflow.com/questions/10021651
复制相似问题