中国象棋将帅问题

来源:互联网 发布:淘宝发新品 编辑:程序博客网 时间:2024/04/26 17:26

已知将A和将B的排列从左到右从上到下依次为1-9,只利用一个变量,找出所有不冲突的组合,不冲突即将A和将B不在一条直线上。注意只能用一个变量。

解法一:用位运算,将一个unsigned char型数前4位表示将A,后四位表示将B,就能够用一个变量来构成循环,输出所有的可能的结构:

#include<iostream>#include<windows.h>using namespace std;  int main()  {  for(int i=1;i<=9;i++){for(int j=1;j<=9;j++)if(i%3!=j%3)cout<<"A="<<i<<",B="<<j<<endl;}unsigned char a=17;cout<<a<<endl;for(;(a&0x0f)<=9;a++)//低四位表示一个棋子for(a&=0x0f,a+=16;(a>>4)<=9;a+=16)//高四位表示另一个棋子if((a&0x0f)%3!=(a>>4)%3)cout<<"A="<<(a&0x0f)<<",B="<<(a>>4)<<endl;    system("pause");      return 0;  }
解法2:将A有9种变化,将B有9中变化,总变化数为81,因此相当于用9进制数表示不同的状态。

#include<iostream>#include<windows.h>using namespace std;  int main()  {  unsigned char a=1;for(;a<=81;a++){if(a/9%3!=a%9%3)cout<<"A="<<a/9+1<<",B="<<a%9+1<<endl;}    system("pause");      return 0;  }
解法3:用位域来存储,也是用一个8位的空间,这个貌似更容易理解。
#include<iostream>#include<windows.h>using namespace std;struct s{unsigned char a:4;unsigned char b:4;};  int main()  {  <span style="white-space:pre"></span>s i;for(i.a=1;i.a<9;i.a++)for(i.b=1;i.b<=9;i.b++)if(i.a%3!=i.b%3)cout<<"A="<<int(i.a)<<",B="<<int(i.b)<<endl;    system("pause");      return 0;  }



0 0
原创粉丝点击