中国象棋将帅问题
来源:互联网 发布:淘宝发新品 编辑:程序博客网 时间: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
- 中国象棋将帅问题
- 中国象棋将帅问题
- 中国象棋将帅问题
- 中国象棋将帅问题
- 中国象棋将帅问题
- 中国象棋将帅问题
- 中国象棋将帅问题
- 中国象棋将帅问题
- 1.中国象棋将帅问题
- 中国象棋的将帅问题
- 中国象棋之将帅问题
- 中国象棋将帅问题
- 1.2中国象棋将帅问题
- 中国象棋将帅问题
- 中国象棋将帅问题
- 中国象棋将帅问题
- 中国象棋的将帅问题
- 中国象棋将帅问题
- SGU111 高精度开方
- C++ Builder使用总结
- Fedora下mysql的安装
- VC++6.0下使用ADO技术访问SQL 数据库
- 蓝桥杯备战--质因数分解
- 中国象棋将帅问题
- Javascript面向对象剖析
- 复习篇 -- 递归和非递归方法实现N!
- uva563(最大流)
- 常用正则表达式收集整理
- TCP通信机制
- 利用linux BT5来破解无线 破解无线
- uva 563(最大流)
- JDBC连接MySQL数据库及示例