【2013-12-23】《编程之美》读书笔记:象棋将帅问题

发布时间:2026/7/15 6:05:16
【2013-12-23】《编程之美》读书笔记:象棋将帅问题 [历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2013-12-23 标题《编程之美》读书笔记象棋将帅问题分类编程 / java / 编程之美 标签java·编程之美·将帅问题《编程之美》读书笔记象棋将帅问题1.2中国象棋将帅问题最简单的Java实现4个for循环使用9字格进行遍历方法A使用9字格进行遍历方法B一点思考最近在学习《 编程之美 》这本书书中提到了很多很经典的算法问题和实现学起来真是耗费脑细胞啊。书中的算法实现使用C编写的这里作者自己写了一部分java的实现如果有错误还请各位读者批评指正。截图版权属于原作者。github【 https://github.com/cstriker1407/think_in_java 】1.2中国象棋将帅问题这里作者备份下一部分java实现最后的结果不一定符合题目要求最简单的Java实现4个for循环for(intlieA1;lieA3;lieA){for(inthangA1;hangA3;hangA){for(intlieB1;lieB3;lieB){if(lieBlieA){continue;}for(inthangB1;hangB3;hangB){intAlieA*100hangA;intBlieB*100hangB;System.out.println(A:A B:B);}}}}使用9字格进行遍历方法Afor(intposA1;posA9;posA){for(intposB1;posB9;posB){if(posA%3posB%3){continue;}// int A ((posA -1)%31) * 100 ((posA - 1)/3 1);// int B ((posB -1)%31) * 100 ((posB - 1)/3 1);// System.out.println(A: A B: B);System.out.println(posA:posA posB:posB);}}使用9字格进行遍历方法B/* 为什么是9*9,考虑到A,B的最大值均为9那么可以确定A*B的所有值都不会超过9*9因此 当totalNum从81开始递减的时候可以保证totalNum/9的值从9开始递减 由余法运算规则可知任何数%9都不会比9大因此totalNum从81开始递减时totalNum/9的值从9开始递减。 */inttotalNum9*9;while(totalNum--!0){// totalNum / 9 A// totalNum % 9 Bif(totalNum/9%3totalNum%9%3){continue;}System.out.println(posA:(totalNum/91) posB:(totalNum%91));}一点思考从遍历方法A和遍历方法B上我们可以看到两层for循环其实是可以合成一层的只是计算量不会缩小。比如原始两层循环intm5;intn3;for(inti0;im;i){for(intj0;jn;j){System.out.println(m:i n:j);}}合成一层循环for(intidx0;idxm*n;idx){System.out.println(m:idx/n n:idx%n);}