读《编程之美》有感—中国象棋将帅问题

请参照书P13-18.

 

题目可以在这里下载到:http://download.csdn.net/source/3126643

题目是这样的:

《读《编程之美》有感—中国象棋将帅问题》

在书中给出了这样的一个解法,却没有给出对这个解法的诠释,这里就对这个解法阐述一下自己的个人观点。

char i=81; while(i–) { if(i / 9 % 3 == i % 9 % 3) continue; printf(“A = %d, B = %d/n”, i / 9 + 1, i % 9 + 1); } return 0; 


对于任意的一个数,我们可以得到这样的一个公式:

a = (a/9)*9 +(a%9)

设 b = a/9; c = a%9;,于是得到:

a= b*9 + c

其中b用于表示”将”的位置,从0开始;c用于表示”帅”的位置,从0开始;

因此: i / 9 % 3 == i % 9 % 3 这个操作,实际上就b%3 == c%3,也就是比较”将”和”帅”的位置是否在同一条直线上了。

a–操作首先减少c值,当c值为0时,b值才减1,c值恢复为9;这样的一个操作就两个for循环的结果一样了,先减少里面那个for循环的值,然后再减少外边的for循环的值。即:

while(i–) 

在这里等同于

for(b=8;b>=0;b–) for(c=8;c>=0;c–) 

    原文作者:hinyunsin
    原文地址: https://blog.csdn.net/hinyunsin/article/details/6277998
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞