2013年12月7日 星期六

UVA - 1352

1352 - Colored Cubes

弄了好久
這題似乎只能暴力

...

邏輯上有兩點
1.找到所有方塊的旋轉方式
2.更改最少的面

我一開始弄成
找到一種旋轉方式
使其他方塊變成第一種= =
還好範側第六組有測到^^


#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
using namespace std;
void _rotate(char status[][7],int n){
    for(int i=1 ; i<4 ; i++){
        status[n+i][0]=status[n+i-1][0];
        status[n+i][1]=status[n+i-1][3];
        status[n+i][2]=status[n+i-1][1];
        status[n+i][3]=status[n+i-1][4];
        status[n+i][4]=status[n+i-1][2];
        status[n+i][5]=status[n+i-1][5];
        status[n+i][6]='\0';
    }
}
void find_status(char status[][7]){
    strcpy(status[0],"123456");
    strcpy(status[4],"263415");
    strcpy(status[8],"326154");
    strcpy(status[12],"421653");
    strcpy(status[16],"513462");
    strcpy(status[20],"653421");
    _rotate(status,0);
    _rotate(status,4);
    _rotate(status,8);
    _rotate(status,12);
    _rotate(status,16);
    _rotate(status,20);
}
int find_color(string temp, string color[26], int *noc){
    for(int i=0 ; i<*noc ; i++)
        if(color[i]==temp)
            return i;
    color[(*noc)++]=temp;
    return (*noc-1);
}
inline int convert(int i, int k, int j){
    if(k==0)
        return 0;
    if(k==1)
        return i%24;
    if(k==2)
        return (i/24)%24;
    if(k==3)
        return (i/576)%24;
}
int diff(int i, char status[][7], int block[][6], int n){
    int re=0;int color[24],maxi;
    for(int j=0 ; j<6 ; j++){
        memset(color,0,4*24);maxi=0;
        for(int k=0 ; k<n ; k++){
            color[block[k][status[convert(i,k,j)][j]-49]]++;
            maxi=(maxi>=color[block[k][status[convert(i,k,j)][j]-49]]?maxi:color[block[k][status[convert(i,k,j)][j]-49]]);
        }
        re+=(n-maxi);
    }
    return re;
}
int guess(char status[][7], int block[4][6], int n, int top){
    int s=100,ts,i;
    for(i=0 ; i<top && s!=0 ; i++){
        ts=diff(i,status,block,n);
        s=(s<ts?s:ts);
    }
    return s;
}
int main(){
    char status[24][7];
    find_status(status);
    int n,ans,ta,top;
    string color[26];int noc;
    string temp;
    int block[4][6];
    while(cin>>n && n!=0){
        noc=0;top=1;ans=50;
        for(int i=0 ; i<n ; i++)
            for(int j=0 ; j<6; j++){
                cin>>temp;
                block[i][j]=find_color(temp,color,&noc);
            }
        noc=n-1;
        while(noc--)
            top*=24;

        ta=guess(status,block,n,top);
        ans=(ans<ta?ans:ta);

        cout<<ans<<'\n';
    }
return 0;
}


寫得有點冗= =
執行時間也有點慢...

沒有留言:

張貼留言

TEST