编程之美 1.2 中国象棋将帅问题


版权所有, 禁止转载, 如有需要, 请站内联系.

本文地址: http://blog.csdn.net/caroline_wendy/article/details/20149075


题目: A表示“将”, B表示“帅”, 请写出一个程序输出A, B所有合法位置, 使用一个字节存储变量.


答案

输出一些互斥的组合, 可以抽象为:


即: 

1, 4, 7 除 3 余 1;

2, 5, 8 除 3 余 2;

3, 6, 9 除 3 余 0;

除3余数(%3)不相等即可;


使用一个字节存储变量是关键, 则需要对2进制数进行操作, unsigned char是占用一个字节;

基本解法

void Chess (void) {  	for (i.a=0; i.a<9; ++i.a)  		for (i.b=0; i.b<9; ++i.b)  			if (i.a%3 != i.b%3)  				printf ("A=%d, B=%d \n", i.a+1, i.b+1);  }

解法2:

可以利用移位运算, 进行求解, 81=10000(3进制), 后两位为一个数字, 前两位为一个数字, 

除法(/)就是移位运算, 除以9就是移两位, 再进行比较余数(%);

void Chess2 (void) {  	unsigned 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);  	}  }

完整代码:

/*   * Test.cpp   *   *  Created on: 2014.2.27   *      Author: Spike   */    /*eclipse cdt, gcc 4.8.1*/    #include <stdio.h>    struct {  	unsigned char a:4; //占4位  	unsigned char b:4;  } i;    void Chess (void) {  	for (i.a=0; i.a<9; ++i.a)  		for (i.b=0; i.b<9; ++i.b)  			if (i.a%3 != i.b%3)  				printf ("A=%d, B=%d \n", i.a+1, i.b+1);  }    void Chess2 (void) {  	unsigned 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);  	}  }    int main (void) {  	Chess();  	return 0;  }  

输出:

A=1, B=2   A=1, B=3   A=1, B=5   A=1, B=6   A=1, B=8   A=1, B=9   A=2, B=1   A=2, B=3   A=2, B=4   A=2, B=6   A=2, B=7   A=2, B=9   A=3, B=1   A=3, B=2   A=3, B=4   A=3, B=5   A=3, B=7   A=3, B=8   A=4, B=2   A=4, B=3   A=4, B=5   A=4, B=6   A=4, B=8   A=4, B=9   A=5, B=1   A=5, B=3   A=5, B=4   A=5, B=6   A=5, B=7   A=5, B=9   A=6, B=1   A=6, B=2   A=6, B=4   A=6, B=5   A=6, B=7   A=6, B=8   A=7, B=2   A=7, B=3   A=7, B=5   A=7, B=6   A=7, B=8   A=7, B=9   A=8, B=1   A=8, B=3   A=8, B=4   A=8, B=6   A=8, B=7   A=8, B=9   A=9, B=1   A=9, B=2   A=9, B=4   A=9, B=5   A=9, B=7   A=9, B=8