编程沙龙(06)

IT商界

  参考本月题目:由8×8见方的棋盘上要放置8个棋子,要求任意两个棋子不能出现在同一行、同一列或同一对角线上。请你给出这8个棋子的摆放方式。

  大家可以利用你擅长的编程工具来完成。再把你的答案发送到software@cpcw.com,邮件主题写上“算法演义答题”。当然们,你在完成此中出现了困难,也可以发信求助我们的专家。

  读者 huwei:看到第3期《编程沙龙》中主持人说了一句话“我现在就觉得程序写到后来就是体力活”,但我喜欢编程,也想干这种体力活……但即使我知道只不过是“熟练工种”,我还是愿意去做!所以希望“编程沙龙”能给我一个做“熟练工种”的机会,建议出一些题目,简单些的,来引导我们!?

  主持人:首先很感谢这位朋友对我们栏目的关心以及他的宝贵建议。现在,手上有我们上期报纸的朋友,一定会发现了我们的“算法演义”的文章结尾有一道“8个棋子”的编程题是留给读者去做的。这是我们的一个尝试,目的就是希望爱好编程的读者朋友能够参与进来、互动起来。

  当然如果你是编程的初学者,在解题中遇到了困难,就欢迎关注“编程沙龙”,在那里我们将和朋友们探讨这些问题,相信会对你学习编程有所帮助。由于版面的限制,我们会将具体的源代码放到网上提供下载。

  下面,针对刚开始学编程的朋友,我简单提一下“8个棋子”的解题思路。不难看出,解这个题就要去尝试不同的摆法并判断是否符合要求。当然我们不可能去历遍64个格子里放8个棋子的所有可能(这是一个很大的数目),并逐一排除。那么我们就要采取“向前走,碰壁回头”的思路,也就是先确定一个棋子的位置,再尝试确定下一个棋子。如果能放下一个棋子而不和先前确定的棋子发生冲突,那我们就可以接着继续确定后一个棋子,直到8个棋子都确定了为止,这样也就得到了一组答案。如果尝试了所有可能结果不能放下一个棋子,则要退回到上一个棋子的确定步骤,再继续尝试。

  关于棋盘,我们可以考虑采用二维数组来表示,这样棋盘上第I行第J列就可以用数组的下标来表示了。当然根据题目的意思,可以知道每一行和列上都只有一个棋子,并且每一行和列上都仅有一个棋子。所以我们可以考虑采用固定列来确定行或者固定行来确定列,这样就可以采用一维数组来记录棋盘。关于一个棋子放的位置是否和先前放的棋子有冲突的判断主要是看对角线是否有冲突。判断对角线冲突的方法可以是根据两个棋子的行数差的绝对值是否等于列数差的绝对值,当然也可以有其他的方法。