分析:已知9种操作,每种操作都会影响几个时钟,现给你9个时钟的初始状态,让你求出最少的操作方案使这9个时钟都调整为12点。根据已知的9种操作写出一个二维矩阵a[9][9],第j列表示第(j+1)种操作,第i行表示影响第(i+1)个时钟,如果第j种操作对第i个时钟有影响,a[j-1][i-1]=1,否则为0。设最小的调整方案为第1个时钟到第9个时钟分别调整ans[0]到ans[8]次,那么(9*9)的矩阵a,乘以(9*1)的矩阵ans,得到的(9*1)的矩阵b, 矩阵b+9个时钟的初始状态的(9*1)矩阵c,和为,如果相加后都是4的倍数,那就满足答案,输出结果。用9个for循环就能把所有的情况都遍历一遍了。
# include <stdio.h>
void Mul(int a[9][9],int ans[9],int b[9])
{
int i,j;
for(i=0;i<9;i++)
for(j=0,b[i]=0;j<9;j++)
b[i]+=a[i][j]*ans[j];
}
int main()
{
int i,j,c[9],ans[9],b[9];
int a[9][9]={1,1,0,1,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,1,1,0,1,0,0,
1,0,1,0,1,0,1,0,1,0,0,1,0,1,1,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,1,0,1,1};
for(i=0;i<9;i++)
scanf("%d",&c[i]);
for(ans[0]=0;ans[0]<4;ans[0]++)
for(ans[1]=0;ans[1]<4;ans[1]++)
for(ans[2]=0;ans[2]<4;ans[2]++)
for(ans[3]=0;ans[3]<4;ans[3]++)
for(ans[4]=0;ans[4]<4;ans[4]++)
for(ans[5]=0;ans[5]<4;ans[5]++)
for(ans[6]=0;ans[6]<4;ans[6]++)
for(ans[7]=0;ans[7]<4;ans[7]++)
for(ans[8]=0;ans[8]<4;ans[8]++)
{
Mul(a,ans,b);
for(i=0;i<9;i++)
if((b[i]+c[i])%4!=0)
break;
if(i==9)
{
for(i=0;i<9;i++)
for(j=0;j<ans[i];j++)
printf("%d ",i+1);
return 0;
}
}
}