• UVALive 3401 彩色立方体


    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1402

    http://7xjob4.com1.z0.glb.clouddn.com/53f6b2526cc5a59ec7881a8fd6d899bd

    题意:将n个原有颜色的立方体涂尽量少次使立方体都相同;

    思路:枚举除第一个面外每个立方体的姿态(24种),姿态由旋转方式先处理得到,再枚举每一个对应面记录要涂的数量。

    处理代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int lleft[7]={0,2,6,3,4,1,5};
     5 int up[7]={0,4,2,1,6,5,3};
     6 
     7 void rot(int *T,int *p)
     8 {
     9     int q[7];
    10     for(int i=1;i<=6;i++)
    11     {
    12         q[i]=p[i];
    13     }
    14 
    15     for(int i=1;i<=6;i++)
    16     {
    17         p[i]=q[T[i]];
    18     }
    19 }
    20 
    21 int main()
    22 {
    23     int p0[7]={0,1,2,3,4,5,6};
    24 
    25     printf("int dice[25][7]= {
    {0},
    ");
    26     for(int i=1;i<=6;i++)
    27     {
    28         int p[7];
    29         for(int j=0;j<=6;j++)
    30             p[j]=p0[j];
    31 
    32         if(i==1) rot(up,p);
    33         if(i==2) {  rot(lleft,p); rot(up,p); }
    34 
    35         if(i==4) {  rot(up,p);rot(up,p); }
    36         if(i==5) {  rot(lleft,p);rot(lleft,p);rot(lleft,p);rot(up,p); }
    37         if(i==6) {  rot(lleft,p);rot(lleft,p);rot(up,p); }
    38 
    39         for(int j=1;j<=4;j++)
    40         {
    41             printf("{%d,%d,%d,%d,%d,%d,%d},",p[0],p[1],p[2],p[3],p[4],p[5],p[6]);
    42             rot(lleft,p);
    43         }
    44         printf("
    ");
    45     }
    46     printf("}; 
    ");
    47 }
    View Code

    计算代码:

      1 #include <bits/stdc++.h>
      2 #include <iostream>
      3 using namespace std;
      4 
      5 int dice[25][7]= {
      6 {0},
      7 {0,4,2,1,6,5,3},{0,2,3,1,6,4,5},{0,3,5,1,6,2,4},{0,5,4,1,6,3,2},
      8 {0,4,6,2,5,1,3},{0,6,3,2,5,4,1},{0,3,1,2,5,6,4},{0,1,4,2,5,3,6},
      9 {0,1,2,3,4,5,6},{0,2,6,3,4,1,5},{0,6,5,3,4,2,1},{0,5,1,3,4,6,2},
     10 {0,6,2,4,3,5,1},{0,2,1,4,3,6,5},{0,1,5,4,3,2,6},{0,5,6,4,3,1,2},
     11 {0,4,1,5,2,6,3},{0,1,3,5,2,4,6},{0,3,6,5,2,1,4},{0,6,4,5,2,3,1},
     12 {0,4,5,6,1,2,3},{0,5,3,6,1,4,2},{0,3,2,6,1,5,4},{0,2,4,6,1,3,5},
     13 };
     14 
     15 int n,ans;
     16 int color[5][7],state[5];
     17 vector <string> colorname;
     18 
     19 int colorid(char str[])
     20 {
     21     int i,j;
     22     string s(str);
     23     int m=colorname.size();
     24     for(i=0;i<m;i++)
     25     {
     26         if(colorname[i]==s)
     27         {
     28             return i;
     29         }
     30     }
     31     colorname.push_back(s);
     32     return m;
     33 }
     34 
     35 void cal()
     36 {
     37     int i,j;
     38     int num=0,maxnum;
     39     map <int,int> cn;
     40     for(j=1;j<=6;j++)
     41     {
     42         cn.clear();
     43         maxnum=0;
     44         for(i=1;i<=n;i++)
     45         {
     46             int cnam=color[i][dice[state[i]][j]];
     47             cn[cnam]++;
     48             if(cn[cnam]>maxnum)
     49                 maxnum=cn[cnam];
     50         }
     51         num+=(n-maxnum);
     52     }
     53     if(ans>num)
     54         ans=num;
     55 }
     56 
     57 void dfs(int m)
     58 {
     59     int i,j;
     60     if(m==n)
     61     {
     62         cal();
     63         return;
     64     }
     65     for(i=1;i<=24;i++)
     66     {
     67         state[m+1]=i;
     68         dfs(m+1);
     69     }
     70 }
     71 int main()
     72 {
     73     char str[30];
     74     int i,j;
     75     while(scanf("%d",&n)!=EOF && n!=0)
     76     {
     77         colorname.clear();
     78         for(i=1;i<=n;i++)
     79         {
     80             for(j=1;j<=6;j++)
     81             {
     82                 scanf("%s",str);
     83                 color[i][j]=colorid(str);
     84             }
     85         }
     86 
     87         if(n==1)
     88         {
     89             ans=0;
     90         }
     91         else
     92         {
     93             ans=24;
     94             state[1]=9;
     95             dfs(1);
     96         }
     97 
     98         printf("%d
    ",ans);
     99     }
    100     return 0;
    101 }
    102 
    103 /*
    104 for(i=1;i<=n;i++)
    105         {
    106             for(j=1;j<=6;j++)
    107             {
    108                 printf("%s ",color[i][j]);
    109             }
    110             printf("
    ");
    111         }
    112         if(strcmp(color[1][2],color[2][3])==0)
    113         {
    114             printf("yes
    ");
    115         }
    116 */
    View Code
  • 相关阅读:
    C# -- HttpWebRequest 和 HttpWebResponse 的使用
    C# -- Lambda 表达式的使用
    ASP.NET -- WebForm -- HttpRequest类的方法和属性
    ASP.NET -- WebForm -- HttpResponse 类的方法和属性
    C# -- 索引器、枚举类型
    C#设计模式之七桥接模式(Bridge Pattern)【结构型】
    C#设计模式之六适配器模式(Adapter Pattern)【结构型】
    C#设计模式之五原型模式(Prototype Pattern)【创建型】
    C#设计模式之四建造者模式(Builder Pattern)【创建型】
    C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】
  • 原文地址:https://www.cnblogs.com/cyd308/p/5644783.html
Copyright © 2020-2023  润新知