一觉睡到了中午,期末成绩不太好,估计大家都能考95+吧,这次的题真的简单,我错了好几个傻逼题都90分。。。难受
养了一只青蛙
今天的基础题目,一道很久以前就该做的题目,正方体六个面涂色UVALive - 3401
思路不难,就是找到所有的旋转方式打表然后处理就行了;
我其实一直很喜欢用STL来做题,这一次写的很麻烦,我是把所有的颜色用string存好,然后把各种状态预处理出来然后再一个一个for循环去暴。结果太慢了,用的vector,string,map太多了,太满了,超时了
然后看了看蓝书上的,很清晰,
1.他没有在最初就储存所有的状态,而是用了dfs去找每次的状态,每次直接取值然后计算;
2.把string,转换成数字(通过出现先后次序作为id来表示这个string),这样就节省了时间和空间
#include <iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
const int inf=0x3f3f3f3f;
int o[25][8]={ {1,2,3,4,5,6},{1,4,2,5,3,6},{1,5,4,3,2,6},{1,3,5,2,4,6},
{2,3,1,6,4,5},{2,6,3,4,1,5},{2,4,6,1,3,5},{2,1,4,3,6,5},
{3,1,2,5,6,4},{3,5,1,6,2,4},{3,6,5,2,1,4},{3,2,6,1,5,4},
{6,4,5,2,3,1},{6,5,3,4,2,1},{6,3,2,5,4,1},{6,2,4,3,5,1},
{5,6,4,3,1,2},{5,4,1,6,3,2},{5,1,3,4,6,2},{5,3,6,1,4,2},
{4,5,6,1,2,3},{4,6,2,5,1,3},{4,2,1,6,5,3},{4,1,5,2,6,3}
};
vector<string> color;
int s[5][10];
int so[5];
int ans;
int n;
int num[50];
int getid(string a)
{
int n=color.size();
for(int i=0;i<n;i++)
if(color[i]==a)
return i;
color.push_back(a);
return n;
}
void solve()
{
int res=0;
for(int i=0;i<6;i++)
{
memset(num,0,sizeof(num));
int maxx=1;
for(int j=0;j<n;j++)
{
// cout<<o[so[j]][i]-1<<",";
int c=s[j][o[so[j]][i]-1];
num[c]++;
maxx=max(maxx,num[c]);
}
//cout<<endl;
res+=(n-maxx);
}
//cout<<"-------"<<endl;
ans=min(res,ans);
}
void dfs(int a)
{
if(a==n)
solve();
else
{
for(int i=0;i<24;i++)
{
so[a]=i;
dfs(a+1);
}
}
}
int main()
{
while(cin>>n&&n)
{
ans=inf;
for(int i=0;i<n;i++)
{
for(int j=0;j<6;j++)
{
string a;
cin>>a;
s[i][j]=getid(a);
}
}
if(n==1)
ans=0;
else
dfs(0);
cout<<ans<<endl;
}
return 0;
}
本以为还会再写的,结果后来就玩去了,,,,,唉这个假放的真的是gg