zoj这个看着比较吓人,我连蒙带猜。。。貌似猜对了。。恩,题意没理解错误,嘻嘻。
两个人的牌有优先级,题目描述很清楚了,如果俩人的牌优先级不同(也就是类型不同,就题目那九个点),那么有高的优先级的那个人赢。
如果有相同的优先级,那么就按对应的优先级里面叙述的比较即可。
因为有九种情况,所以造成了冗长的代码。。。囧。。。
觉得我这次代码写的还蛮好的~~还算清晰吧,具体的函数用处看注释~
刚搜了下网上的代码。有些讲解比较清楚。。。但是。。貌似我代码算短的啦~~哈哈~~
#include <set> #include <map> #include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <string> #include <algorithm> #define MID(x,y) ( ( x + y ) >> 1 ) #define L(x) ( x << 1 ) #define R(x) ( x << 1 | 1 ) #define FOR(i,s,t) for(int i=(s); i<(t); i++) #define BUG puts("here!!!") #define STOP system("pause") #define file_r(x) freopen(x, "r", stdin) #define file_w(x) freopen(x, "w", stdout) using namespace std; const int MAX = 6; int b[MAX], w[MAX]; int cb[MAX], cw[MAX]; int value(char c) { if( isdigit(c) ) return c - '0'; switch( c ) { case 'T' : return 10; case 'J' : return 11; case 'Q' : return 12; case 'K' : return 13; case 'A' : return 14; } } int color(char c)// C D H S { switch( c ) { case 'C' : return 0; case 'D' : return 1; case 'H' : return 2; case 'S' : return 3; } } bool is_con(int *a) //检查是否为顺 { FOR(i, 1, 5) if( a[i] != a[i-1] + 1 ) return false; return true; } bool is_samecolor(int *a) // 检查是否为同种花色 { FOR(i, 1, 5) if( a[i] != a[0] ) return false; return true; } bool check(int *a, int val) // 检查从a这个地址起val个数字是否相同 { FOR(i, 0, val) if( a[i] != a[0] ) return false; return true; } bool is_four(int *a) // 检查是否是4个花色一样的 { if( check(a+1, 4) || check(a, 4) ) return true; return false; } bool is_3_2(int *a) // 检查是否是 3 + 2 { if( check(a, 3) && check(a+3, 2) || check(a, 2) && check(a+2, 3) ) return true; return false; } bool is_3_1_1(int *a) // 3 + 1 + 1 { if( check(a,3) || check(a+1, 3) || check(a+2, 3) ) return true; return false; } bool is_2_2_1(int *a) // 2 + 2 + 1 { if( check(a,2) && check(a+2,2) || check(a+1, 2) && check(a+3, 2) || check(a,2) && check(a+3, 2) ) return true; return false; } bool is_2_1_1_1(int *a) // 2 + 1 + 1 + 1 { if( check(a,2) || check(a+1, 2) || check(a+2,2) || check(a+3, 2) ) return true; return false; } int level(int *a, int *color) // 找所在的优先级 { if( is_con(a) && is_samecolor(color) ) return 1; if( is_four(a) ) return 2; if( is_3_2(a) ) return 3; if( is_samecolor(a) ) return 4; if( is_con(a) ) return 5; if( is_3_1_1(a) ) return 6; if( is_2_2_1(a) ) return 7; if( is_2_1_1_1(a) ) return 8; return 9; } int find(int *a, int n) // 找重复次数为n次的数字 { for(int i=0; i+n<=5; i++) if( check(a+i, n) ) return a[i]; } int com_1(int *b, int *c, int n) // 从大到小开始比较 { for(int i=n-1; i>=0; i--) { if( b[i] > c[i] ) return 1; if( c[i] > b[i] ) return -1; } return 0; } int com_2() { int tb, tw; tb = find(b, 4); tw = find(w, 4); if( tb > tw ) return 1; if( tb < tw ) return -1; return 0; } int com_3() { int tb, tc; tb = find(b, 3); tc = find(w, 3); if( tb > tc ) return 1; if( tb < tc ) return -1; return 0; } int com_5() { if( b[4] > w[4] ) return 1; if( b[4] < w[4] ) return -1; return 0; } int com_6() { int tb, tc; tb = find(b, 3); tc = find(w, 3); if( tb > tc ) return 1; if( tb < tc ) return -1; return 0; } int com_7() { int tb[3], tw[3]; int cntb = 1, cntw = 1; FOR(i, 1, 5) { if( b[i] == b[i-1] ) tb[cntb++] = b[i]; if( w[i] == w[i-1] ) tw[cntw++] = w[i]; } if( tb[2] < tb[1] ) swap(tb[2], tb[1]); if( tw[2] < tw[1] ) swap(tw[2], tw[1]); FOR(i, 0, 5) { if( b[i] != tb[1] && b[i] != tb[2] ) tb[0] = b[i]; if( w[i] != tw[1] && w[i] != tw[2] ) tw[0] = w[i]; } return com_1(tb, tw, 3); } int com_8() { int tb[4], tw[4]; tb[3] = find(b, 2); tw[3] = find(w, 2); int cntb = 0, cntw = 0; FOR(i, 0, 5) { if( b[i] != tb[3] ) tb[cntb++] = b[i]; if( w[i] != tw[3] ) tw[cntw++] = w[i]; } return com_1(tb, tw, 4); } int compare(int l) { switch( l ) { case 1: return com_1(b, w, 5); case 2: return com_2(); case 3: return com_3(); case 4: return com_1(b, w, 5); case 5: return com_5(); case 6: return com_6(); case 7: return com_7(); case 8: return com_8(); case 9: return com_1(b, w, 5); } } int solve() { int lb = level(b, cb); int lw = level(w, cw); if( lb < lw ) return 1; if( lw < lb ) return -1; return compare(lb); } int main() { char s[10]; while( ~scanf("%s", s) ) { b[0] = value(s[0]); cb[0] = color(s[1]); FOR(i, 1, 5) { scanf("%s", s); b[i] = value(s[0]); cb[i] = color(s[1]); } sort(b, b+5); FOR(i, 0, 5) { scanf("%s", s); w[i] = value(s[0]); cw[i] = color(s[1]); } sort(w, w+5); int ans = solve(); if( ans == 0 ) puts("Tie."); else if( ans == 1 ) puts("Black wins."); else puts("White wins."); } return 0; }