|
和上面一样,m(n)为开始状态与目标状态的每位异或。至于是否存在解,本人已将次系数矩阵化简为对角矩阵,可以看到系数矩阵的秩(Rank)与未知数的个数相等,所以无论是任何的输入和输出变换都能找到唯一解。
本人程序如下:
int MinChange(const int Start[],const int End[]){
int m[10];
int k[10];
int res=0;
int i,j,n;
for(i=0;i<10;i++){
m[i]=Start[i]^End[i]; /* m[]=Start[] XOR End[] */
}
/* calculate roots */
k[0]=m[0]^m[2]^m[3]^m[5]^m[6]^m[8]^m[9];
k[1]=m[2]^m[3]^m[5]^m[6]^m[8]^m[9];
k[2]=m[0]^m[1];
k[3]=m[3]^m[0]^m[1]^m[5]^m[6]^m[8]^m[9];
k[4]=m[5]^m[6]^m[8]^m[9];
k[5]=m[4]^m[3]^m[0]^m[1];
k[6]=m[6]^m[4]^m[3]^m[0]^m[1]^m[8]^m[9];
k[7]=m[8]^m[9];
k[8]=m[7]^m[6]^m[4]^m[3]^m[0]^m[1];
k[9]=m[9]^m[7]^m[6]^m[4]^m[3]^m[0]^m[1];
/* count for switch times */
for(j=0;j<10;j++){
if(k[j]) res++;
}
/* display k(n); */
for(n=0;n<10;n++) printf("%d,",k[n]);
return res;
}
测试主程序:
main(){
int A[10]={1,1,1,0,0,1,0,1,1,0};
int B[10]={0,0,1,1,0,0,1,1,1,1};
int C;
C=MinChange(A,B);
printf("**%d**",C);
}
显示结果为:
1,0,0,0,1,1,1,1,0,1,**6**
就是如果要把状态A转为状态B,需要把第0,4,5,6,7,9号开关翻动一次,共6次。
测试验证结果正确:)
当然,此做法也有一个缺点,就是当灯的个数改变时,就要重新设定线形方程组的特解形式。 上一页 [1] [2]
 【责编:Youping】 |