先注:在编程问题中遇到的一些问题:C语言中表示二进制数 采用0x或者0,而不采用显示二进制表示。
所谓象棋问题就是使用避免将帅相遇而进行的一种输出工作。
算法抽象:
两个难点:(1)表示将帅的位置。(2)使用一个变量表示两个位置。
最笨的办法 多个变量解决该问题:
//for (int i= 0;i < 3;i ++)
//{
// for (int j = 0;j < 3;j++)
// {
// for (int t = 0;t < 3;t++)
// {
// if (j == t)
// {
// for (int k = 0;k < 3;k++)
// {
// printf("A:%d,%d,B:%d,%d.\n",i,j,k,(t+1)%3);
// printf("A:%d,%d,B:%d,%d.\n",i,j,k,(t+2)%3);
// }
// }
// }
// }
//}
微软的思路
(1)使用byte变量表示,前四位和后四位分别表示将帅的两个位置。
(2)使用位操作,进行取舍。
其算法为:我的实现
//byte info = 0x00; //info的高四位表示将A的位置4位可表示16个状态(我们只是用0-8状态)
// //info的低四位表示帅B的位置,同上(我们只是用0-8状态)
//for (;info <= 0x80;info += 0x10) //循环info 遍历A
//{
// for (;(info&0x0f) <= 0x08;info += 0x01)//循环info 遍历B
// {
// if ((info >> 4)%3 != (info & 0x0f)%3)//排除列相同元素
// {
// printf("A:%d,%d,B:%d,%d.\n",(info >> 4)/3,(info >> 4)%3,(info & 0x0f)/3,(info & 0x0f)%3);//输出
// }
// }
// info = info & 0xf0;//重置info的第四位 进行下一次循环
//}
另一种极为简便的思路为:(算法极为简便)
(1)使用9*9=81表示总的状态
(2)剔除不相关的状态
byte i = 81;li
while(i--)
{
if (i/9%3 == i%9%3)
continue;
printf("A:%d,%d,B:%d,%d.\n",i/9/3,i/9%3,i%9/3,i%9%3);
}