• 第一周 枚举: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 }
  • 相关阅读:
    一致性哈希算法
    Discourse 的标签(Tag)只能是小写的原因
    JIRA 链接 bitbucket 提示错误 Invalid OAuth credentials
    JIRA 如何连接到云平台的 bitbucket
    Apache Druid 能够支持即席查询
    如何在 Discourse 中配置使用 GitHub 登录和创建用户
    Apache Druid 是什么
    Xshell 如何导入 PuTTYgen 生成的 key
    windows下配置Nginx支持php
    laravel连接数据库提示mysql_connect() :Connection refused...
  • 原文地址:https://www.cnblogs.com/Konayuki2015/p/4514222.html
Copyright © 2020-2023  润新知