UVALive 3401 Colored Cubes

其实题目不算难 就是麻烦一些 尤其是当你手推24组旋转的的时候...其实从{0,1,2,3,4,5}旋转的结果是有一点规律可循的 首先你先选出正面 即第一个数 第二个数就只有4种选择 然后从图中找出第三个数 剩下的3个数 其实已经固定了 因为立方体无论怎么旋转 0和5永远是相对的 所以0在3位置 5就一定在4位置 所以得出以3.5为轴 对应位置和为5  这样就能稍微好推点 说了这么多 然而并没有什么卵用 我还是推错了(>﹏<) 然后懒得找是哪推错了 就在网上复制了一份数组  所以还是建议大家像刘汝佳那样编一份代码来弄 不容易出错(不过对我来说编代码来推 肯定更慢 更容易出错(>﹏<)) 旋转的问题解决后 其他的就好办了 用map处理的编号 dfs跑出除第一个以外 其他的旋转姿势 然后暴力的跑出ans即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
#include<set>
#define scnaf scanf
#define cahr char
#define bug puts("bugbugbug");
using namespace std;
typedef long long ll;
const int mod=1000000007;
const int maxn=10000+5;
const int inf=1e9;
int rota[24][10]=
{
    //按照正右上 下左后 排列 确定好前3个后 以3.5为轴 和为5
    { 0, 1, 2, 3, 4, 5 },
    { 0, 2, 4, 1, 3, 5 },
    { 0, 4, 3, 2, 1, 5 },
    { 0, 3, 1, 4, 2, 5 },
    { 3, 1, 0, 5, 4, 2 },
    { 3, 0, 4, 1, 5, 2 },
    { 3, 4, 5, 0, 1, 2 },
    { 3, 5, 1, 4, 0, 2 },
    { 5, 1, 3, 2, 4, 0 },
    { 5, 3, 4, 1, 2, 0 },
    { 5, 4, 2, 3, 1, 0 },
    { 5, 2, 1, 4, 3, 0 },
    { 2, 1, 5, 0, 4, 3 },
    { 2, 5, 4, 1, 0, 3 },
    { 2, 4, 0, 5, 1, 3 },
    { 2, 0, 1, 4, 5, 3 },
    { 4, 0, 2, 3, 5, 1 },
    { 4, 2, 5, 0, 3, 1 },
    { 4, 5, 3, 2, 0, 1 },
    { 4, 3, 0, 5, 2, 1 },
    { 1, 0, 3, 2, 5, 4 },
    { 1, 3, 5, 0, 2, 4 },
    { 1, 5, 2, 3, 0, 4 },
    { 1, 2, 0, 5, 3, 4 }
};
int a[10][10];
int b[10][10];
int cnt,ans,n;
map<string, int >mp;
void init()
{
    cnt=1;
    ans=inf;
    mp.clear();
}
void READ(int& z)
{
    string b;
    cin>>b;
    if(mp[b]==0)
        mp[b]=cnt++;
    z=mp[b];
}

void go()
{
    int sum=0;
    for(int j=0; j<6; j++)
    {
        int visit[30]= {0};
        for(int i=0; i<n; i++)
        {
            int z=b[i][j];
            visit[z]++;
        }
        int maxx=0;
        for(int i=0; i<=24; i++)
            maxx=max(maxx,visit[i]);
        sum+=n-maxx;
    }
    ans=min(ans,sum);
}
void change(int id,int i)
{
    for(int j=0; j<6; j++)
        b[id][j]=a[id][rota[i][j]];
}
void dfs(int id)
{
    if(id==n)
    {
        go();
        return;
    }
    for(int i=0; i<24; i++)
    {
        change(id,i);
        dfs(id+1);
    }
}
int main()
{
    while(scanf("%d",&n)&&n)
    {
        init();
        for(int i=0; i<n; i++)
            for(int j=0; j<6; j++)
                READ(a[i][j]);
        for(int i=0; i<6; i++)
            b[0][i]=a[0][i];
        dfs(1);
        printf("%d\n",ans);
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值