象棋将帅问题
《编程之美》第二个问题,将帅位置的组合,要求只能使用一个变量。
问题本身很简单,但是加上要求限制之后(只能使用一个变量)就需要深入思考这个变量该存储什么内容了,仔细思考,将A的位置为9选1有9种可能,帅B的位置也为9选1有9种可能,二者组合共有81种可能,所以用一个能存够81个不同元素的byte类型即可搞定。
a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7 | a8 | |
b0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
b1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
b2 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
b3 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
b4 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
b5 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
b6 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 |
b7 | 63 | 64 | 65 | 66 | 67 | 78 | 69 | 70 | 71 |
b8 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 |
使用一个循环遍历这81中可能,从中排除不能共存的位置即可,那么问题就该集中在如何排除不能共存的位置,比如a0和b0,b3,b6是不能共存的,那么也就是0,27,54需要被排除在外,我们用site代表将帅的位置组合,x代表将的位置,y代表帅的位置那么x+9*y=site,并且(x=[0-8],y=[0-8]),那么当x=0,3,6时y!=0,3,6以此类推,需要排除掉的情况就是site/9%3 == site%9%3。
/** * A a0 a1 a2 * a3 a4 a5 * a6 a7 a8 * * B b0 b1 b2 * b3 b4 b5 * b6 b7 b8 */ public class ABStrike { public static void main(String[] args) { byte site = 0; for (site = 0; site < 81; site++) { if (site/9%3 == site%9%3) continue; System.out.println("A:" + site%9 + " B:" + site/9); } } }
-------------------------------
问道,修仙
-------------------------------