POJ 1166 The Clocks

10 篇文章 0 订阅

分析:已知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;
                            }
                        }
  }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值