百练练习2814拨钟问题(枚举法)

题目链接http://bailian.openjudge.cn/practice/2814/
思路:逐步枚举,暴力。。。
题目本来是这样:
移动 影响的时钟
1 ABDE
2 ABC
3 BCEF
4 ADG
5 BDEFH
6 CFI
7 DEGH
8 GHI
9 EFHI
这样不好理解,可以转换为时钟会被哪些移动影响

A 124
B 1235
C 236
D 1457
E 13579
F 3569
G 478
H 5789
I 689
这样就只需用九个for循环,找到使每个钟初始状态加最后移动的对4取模等于0时即可。
代码在此

#include 
using namespace std;
int main()
{
    int a[11];\\初始钟
    int moves[11]={0};\\存移动次数
     for(int i = 1;i<=9;++i)
     {
         scanf("%d",&a[i]);
     }
     int sum = 0;     
         for(moves[1] = 0;moves[1]<4;moves[1]++) 
         for(moves[2] = 0;moves[2]<4;moves[2]++) 
         for(moves[3] = 0;moves[3]<4;moves[3]++) 
         for(moves[4] = 0;moves[4]<4;moves[4]++)
         for(moves[5] = 0;moves[5]<4;moves[5]++) 
         for(moves[6] = 0;moves[6]<4;moves[6]++)  
         for(moves[7] = 0;moves[7]<4;moves[7]++) 
         for(moves[8] = 0;moves[8]<4;moves[8]++) 
         for(moves[9] = 0;moves[9]<4;moves[9]++) 
         {
             sum = 0;
             sum+= (a[1]+moves[1]+moves[2]+moves[4])%4;//A钟
             sum+= (a[2]+moves[1]+moves[2]+moves[3]+moves[5])%4;//B钟
             sum+= (a[3]+moves[2]+moves[3]+moves[6])%4;//C。
             sum+= (a[4]+moves[1]+moves[4]+moves[5]+moves[7])%4;//D。
             sum+= (a[5]+moves[1]+moves[3]+moves[5]+moves[7]+moves[9])%4;//E。
             sum+= (a[6]+moves[3]+moves[5]+moves[6]+moves[9])%4;//F。
             sum+= (a[7]+moves[4]+moves[7]+moves[8])%4;//G。
             sum+= (a[8]+moves[5]+moves[7]+moves[8]+moves[9])%4;//H。
             sum+= (a[9]+moves[6]+moves[8]+moves[9])%4;//I。
             if(sum == 0)
             {
              for(int j=1;j<=9;j++)
                 {
                      while(moves[j]--)
                      {
                          cout <<j<<" ";
                      }
                }
                    return 0;
             }
 }

你可能感兴趣的:(NOI)