card sorting

来源:互联网 发布:网络传销崩盘前兆 编辑:程序博客网 时间:2024/06/06 12:37


对纸牌正反排序


暴力  , 状压

#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 ;}

原创粉丝点击