zoukankan      html  css  js  c++  java
  • LA 3401 Colored Cubes (搜索 + 暴力)

    https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4098

    首先打表,正方体旋转的 (24) 种姿态

    枚举所有正方体的旋转状态(第 (1) 个正方体不用旋转),对每个面,保留最多的颜色,其它颜色重涂

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    const int maxn = 4;
    
    int dice24[25][6] = {
    {2, 1, 5, 0, 4, 3}, {2, 0, 1, 4, 5, 3}, {2, 4, 0, 5, 1, 3}, {2, 5, 4, 1, 0, 3},
    {4, 2, 5, 0, 3, 1}, {5, 2, 1, 4, 3, 0}, {1, 2, 0, 5, 3, 4}, {0, 2, 4, 1, 3, 5},
    {0, 1, 2, 3, 4, 5}, {4, 0, 2, 3, 5, 1}, {5, 4, 2, 3, 1, 0}, {1, 5, 2, 3, 0, 4},
    {5, 1, 3, 2, 4, 0}, {1, 0, 3, 2, 5, 4}, {0, 4, 3, 2, 1, 5}, {4, 5, 3, 2, 0, 1},
    {1, 3, 5, 0, 2, 4}, {0, 3, 1, 4, 2, 5}, {4, 3, 0, 5, 2, 1}, {5, 3, 4, 1, 2, 0},
    {3, 4, 5, 0, 1, 2}, {3, 5, 1, 4, 0, 2}, {3, 1, 0, 5, 4, 2}, {3, 0, 4, 1, 5, 2}
    };
    
    int n, ans;
    
    vector<string> names;
    int dice[maxn][6];
    int ID(const char *name){
    	string s(name);
    	int l = names.size();
    	for(int i = 0 ; i < l ; ++i){
    		if(names[i] == s) return i;
    	} 
    	names.push_back(s);
    	return l;
    }
    
    int r[maxn], color[maxn][6];
    
    void check(){
    	for(int i = 0 ; i < n ; ++i)
    		for(int j = 0 ; j < 6 ; ++j)
    			color[i][dice24[r[i]][j]] = dice[i][j];
    		
    	int res = 0;	
    	for(int j = 0 ; j < 6 ; ++j){
    		int mx = 0;
    		
    		int cnt[maxn * 6];
    		memset(cnt, 0, sizeof(cnt));
    		for(int i = 0 ; i < n ; ++i){
    			mx = max(mx, ++cnt[color[i][j]]);
    		}
    		res += n - mx;
    	}
    	ans = min(ans, res);
    }
    
    void dfs(int d){
    	if(d == n){
    		check();
    		return;
    	}
    	
    	for(int i = 0 ; i < 24 ; ++i){
    		r[d] = i;
    		dfs(d + 1);
    	}
    }
    
    ll read(){ ll s = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); } return s * f; }
    
    int main(){
    	while(scanf("%d", &n) == 1 && n){
    		names.clear();
    		for(int i = 0 ; i < n ; ++i){
    			for(int j = 0 ; j < 6 ; ++j){
    				char s[30];
    				scanf("%s", s);
    				dice[i][j] = ID(s);
    			}
    		}
    		
    		ans = n * 6;
    		
    		r[0] = 0;
    		dfs(1);
    		
    		printf("%d
    ", ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    客户端session与服务端session
    对session和cookie的一些理解
    Servlet生命周期与工作原理
    Linux命令行编辑快捷键
    含有GROUP BY子句的查询中如何显示COUNT()为0的成果(分享)
    设计模式学习——准备(UML类图)
    find()方法
    js中的动态效果
    动态添加,移除,查找css属性的方法
    VUE中的require ( )
  • 原文地址:https://www.cnblogs.com/tuchen/p/14838862.html
Copyright © 2011-2022 走看看