zoukankan      html  css  js  c++  java
  • 第一周 枚举:2.拨钟问题

    总时间限制:
    1000ms
    内存限制:
    65536kB
    描述

    有9个时钟,排成一个3*3的矩阵。

    现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。


    移动    影响的时钟

    1 ABDE
    2 ABC
    3 BCEF
    4 ADG
    5 BDEFH
    6 CFI
    7 DEGH
    8 GHI
    9 EFHI
    (图 2)
    输入
    从标准输入设备读入9个整数,表示各时钟指针的起始位置。0=12点、1=3点、2=6点、3=9点。
    输出
    输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号大小,输出结果。
    样例输入
    3 3 0 
    2 2 2 
    2 1 2 
    样例输出
    4 5 8 9 
      1 #include <iostream>
      2 #include <cstdio>
      3 using namespace std;
      4 int state[5][5] = {0};
      5 int s[5][5] = {0};
      6 int swit[5][5] = {0};
      7 int cop[5][5] = {0};
      8 int sum = 0;
      9 int mi = 100;
     10  
     11 void changeswit(int a, int b, int t)
     12 {
     13     int no = (a - 1) * 3 + b;
     14     if(b == 2 && a != 2)
     15     {
     16         state[a][b - 1] = (state[a][b - 1] + t) % 4;
     17         state[a][b] = (state[a][b] + t) % 4;
     18         state[a][b + 1] = (state[a][b + 1] + t) % 4;
     19     }
     20     else if(a == 2 && b != 2)
     21     {
     22         state[a - 1][b] = (state[a - 1][b] + t) % 4;
     23         state[a][b] = (state[a][b] + t) % 4;
     24         state[a + 1][b] = (state[a + 1][b] + t) % 4;
     25     }
     26     else if(a == 2 && b == 2)
     27     {
     28         state[a][b] = (state[a][b] + t) % 4;
     29         state[a - 1][b] = (state[a - 1][b] + t) % 4;
     30         state[a + 1][b] = (state[a + 1][b] + t) % 4;
     31         state[a][b - 1] = (state[a][b - 1] + t) % 4;
     32         state[a][b + 1] = (state[a][b + 1] + t) % 4;
     33     }
     34     else
     35     {
     36         int dx[3] = {-1, 0, 1};
     37         int dy[3] = {-1, 0, 1};
     38         for(int i = 0; i < 3; i++)
     39             for(int j = 0; j < 3; j++)
     40                 state[a+dx[i]][b+dy[j]] = (state[a+dx[i]][b+dy[j]] + t) % 4;
     41     }
     42     return;
     43  
     44 }
     45  
     46  
     47 int main()
     48 {
     49     for(int i = 1; i <= 3; i++)
     50         for(int j = 1; j <= 3; j++)
     51             scanf("%d",&s[i][j]);
     52     for(int i = 0; i < 4; i++)
     53     {
     54         for(int j = 0; j < 4; j++)
     55         {
     56             for(int k = 0; k < 4; k++)
     57             {
     58                 for(int l = 1; l < 4; l++)
     59                     for(int m = 1; m < 4; m++)
     60                     {
     61                         state[l][m] = s[l][m];
     62                         swit[l][m] = 0;
     63                     }
     64                 sum = 0;
     65  
     66                 swit[1][1] = i;
     67                 swit[1][2] = j;
     68                 swit[1][3] = k;
     69                 changeswit(1,1,i);
     70                 changeswit(1,2,j);
     71                 changeswit(1,3,k);
     72  
     73                 if(state[1][1] != 0)
     74                 {
     75                     swit[2][1] = 4 - state[1][1];
     76                     changeswit(2,1,4 - state[1][1]);
     77                 }
     78                 if(state[1][3] != 0)
     79                 {
     80                     swit[2][3] = 4 - state[1][3];
     81                     changeswit(2,3,4 - state[1][3]);
     82                 }
     83                 if(state[1][2] != 0)
     84                 {
     85                     swit[2][2] = 4 - state[1][2];
     86                     changeswit(2,2,4 - state[1][2]);
     87                 }
     88                 if(state[2][1] != 0)
     89                 {
     90                     swit[3][1] = 4 - state[2][1];
     91                     changeswit(3,1,4 - state[2][1]);
     92                 }
     93                 if(state[2][3] != 0)
     94                 {
     95                     swit[3][3] = 4 - state[2][3];
     96                     changeswit(3,3,4 - state[2][3]);
     97                 }
     98                 if(state[2][2] != 0) continue;
     99                 if(state[3][1] == state[3][2] && state[3][1] == state[3][3])
    100                 {
    101                     swit[3][2] = (4 - state[3][1]) % 4;
    102                     for(int l = 1; l < 4; l++)
    103                         for(int m = 1; m < 4; m++)
    104                             sum += swit[l][m];
    105                     if(sum < mi)
    106                     {
    107                         mi = sum;
    108                         for(int l = 1; l < 4; l++)
    109                             for(int m = 1; m < 4; m++)
    110                                 cop[l][m] = swit[l][m];
    111                     }
    112                 }
    113                 else continue;
    114             }
    115         }
    116     }
    117     bool f = 0;
    118     for(int i = 1; i < 4; i++)
    119         for(int j = 1; j < 4; j++)
    120         {
    121             while(cop[i][j]--)
    122             {
    123                 if(f) printf(" ");
    124                 printf("%d", 3*(i - 1) + j);
    125                 f = 1;
    126             }
    127         }
    128     printf("\n");
    129     return 0;
    130 }
  • 相关阅读:
    应用上架前如何知道自己应用的下载地址?
    Multi-line NSAttributedString with truncated text
    Adding AirDrop File Sharing Feature to Your iOS Apps
    Add sharing to your app via UIActivityViewController
    [原]iOS自带社会化分享框架——Social.framework
    xcode 制作静态库.a文件 详解
    Fiddler怎么对IPhone手机的数据进行抓包分析
    Mac上的抓包工具Charles
    30、准确计算CoreText高度的方法
    keil MDK中如何生成*.bin格式的文件
  • 原文地址:https://www.cnblogs.com/Konayuki2015/p/4514222.html
Copyright © 2011-2022 走看看