|
发表于 2004-3-28 01:18:01
|
显示全部楼层
具体算法:
1. 设黑色的棋子为0,白色的棋子为1;若初始为10100100,则应填充
1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0
其中1,3...15位为初始排序,2,4...16位为插入,去掉1,3...15位结果为
0001010
2. (0001010)=(10100100)xor(01001001)其中(01001001)为(10100100)
循环左移.
3.用D(i,n)表示第i位经过n次调整,有D(i,n)=D(i,n-1) xor D(i+1,n-1)
=(D(i,n-2) xor D(i+1,n-2))(D(i+1,n-2) xor D(i+2,n-2))
=D(i,n-2) xor 0 xor D(i+1,n-2) (合并二三项)
=.......
=0 (n==8)(因为有D(i,n-8)=D(i+8,n-8))
4.所以经过小于8次调整,结果应该全为黑.
如:
(1)
01101111
10110001
11010010
01110111
10011001
10101010
11111111
00000000
(2)
11111010
00001111
00010001
00110011
01010101
11111111
00000000
00000000
00000000
可用C++穷举验证:
#include<iostream.h>
void main()
{
short int s[8]={0,0,0,0,0,0,0,0},a=0,b=0;
short int from=10,to=100;
for(a=from;a<=to;a++){b=a;
for(int k=0;k<8;k++){s[7-k]=b%2;b=int(b/2);}
for(int j=0;j<=8;j++){
for(int m=0;m<8;m++)cout<<s[m];
cout<<'\t';
myxor(s);//实现p=s; ROL p, 1; s=s xor p; 其中rol为汇编语句
//表示循环左移(Rotate Left)
}
cout<<endl<<endl;
for(int i=0;i<8;i++)if(s!=0)cout<<s;
}
}
并建议用汇编实现.myxor(s);在C++中的效率很低又调用频繁.
|
|