card sorting


對紙牌正反排序


暴力  , 狀壓

#include <bits/stdc++.h>
using namespace std;

int nu[200] , co[200] , best[200];
int term[4] ;
bool judge(int i , int j , int zhuangya){
    if(co[i] == co[j]){
        if((zhuangya>>co[i]) & 1)
            return nu[i] < nu[j] ;
        else
            return nu[i] > nu[j] ;
    }else{
        return term[ co[i] ] < term[ co[j] ] ;
    }
}

int main(){
    int n ;
    map<char , int> num ;
    num['T'] = 10 ;
    num['J'] = 11 ;
    num['Q'] = 12 ;
    num['K'] = 13 ;
    num['A'] = 14 ;

    map<char , int> color ;
    color['s'] = 0 ;
    color['h'] = 1 ;
    color['d'] = 2 ;
    color['c'] = 3 ;
    char read[5] ;

    while( ~ scanf("%d" , &n)){
        for(int i = 0 ; i < n ; i ++ ){
            scanf("%s" , read) ;
            if(num.count( read[0] )) nu[i] = num[ read[0] ] ;
            else nu[i] = read[0] - '0' ;
            co[i] = color[ read[1] ] ;
        }
        for(int i = 0 ; i < 4 ; i ++ ) term[i] = i ;
        int ans = 200 ;
        do{
            for(int zhuangya = 0 ; zhuangya < 16 ; zhuangya ++ ){
                for(int i = n - 1 ; i >= 0 ; i -- ){
                    best[i] = 1 ;
                    for(int j = i + 1 ; j < n ; j ++ ){
                        if(judge(i , j , zhuangya))
                            best[i] = max(best[i] , best[j] + 1 );
                    }
                    ans = min(ans , n - best[i]) ;
                }
            }
        }while(next_permutation(term , term + 4)) ;
        cout << ans << endl ;
    }

    return 0 ;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章