首页 > 代码库 > 2014 HDU多校弟六场J题 【模拟斗地主】

2014 HDU多校弟六场J题 【模拟斗地主】

这是一道5Y的题目

有坑的地方我已在代码中注释好了 QAQ 

Ps:模拟题还是练的太少了,速度不够快诶

//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler#include <stdio.h>#include <iostream>#include <climits>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <algorithm>#define ll long longusing namespace std;const int INF = 0x3f3f3f3f;const int MAXN = 1001;char array_a[30], array_b[30];int store_a[16], store_b[16];char rules[16];bool ans;int find_rank(char num){    for(int i = 1; i <= 15; ++i){        if(rules[i] == num){            return i;        }    }}void init(){    ans = false;    rules[1] = 3, rules[2] = 4, rules[3] = 5, rules[4] = 6;    rules[5] = 7, rules[6] = 8, rules[7] = 9, rules[8] = T;    rules[9] = J, rules[10] = Q, rules[11] = K, rules[12] = A;    rules[13] = 2, rules[14] = X, rules[15] = Y;    memset(store_a, 0, sizeof(store_a));    memset(store_b, 0, sizeof(store_b));    for(int i = 0; i < strlen(array_a); ++i)        ++store_a[find_rank(array_a[i])];    for(int i = 0; i < strlen(array_b); ++i)        ++store_b[find_rank(array_b[i])];}bool lose(){    int i, j;    if(store_b[14] == 1 && store_b[15] == 1)    return true;    for(i = 1; i <= 13; ++i)        if(store_b[i] == 4) return true;    return false;}bool way_2(){    int i, j;    int get_a_max, get_b_max;    if(lose())  return false;    for(i = 15; i >= 1; --i){        if(store_a[i]){            get_a_max = i;            break;        }    }    for(i = 15; i >= 1; --i){        if(store_b[i]){            get_b_max = i;            break;        }    }    if(get_a_max >= get_b_max)  return true;    return false;}bool way_3(){    int i, j;    if(store_a[14] == 1 && store_a[15] == 1)    return true;    if(way_2()) return true;    if(lose())  return false;    int get_a_max, get_b_max;    get_a_max = get_b_max = 0;//get_*_max init 0    for(i = 13; i >= 1; --i){        if(store_a[i] == 2){            get_a_max = i;            break;        }    }    for(i = 13; i >= 1; --i){        if(store_b[i] == 2){            get_b_max = i;            break;        }    }    if(get_a_max == 0)  return false;//if get_*_max is still 0 , return false    else if(get_a_max >= get_b_max)  return true;    return false;}bool way_4(){    int i, j;    if(way_3()) return true;    if(lose())  return false;    int get_a_max, get_b_max;    get_a_max = get_b_max = 0;//    for(i = 13; i >= 1; --i){        if(store_a[i] == 3){            get_a_max = i;            break;        }    }    for(i = 13; i >= 1; --i){        if(store_b[i] == 3){            get_b_max = i;            break;        }    }    if(get_a_max == 0)  return false;//    else if(get_a_max >= get_b_max)  return true;    return false;}bool way_5(){    int i, j;    if(way_4()) return true;    if(store_b[14] == 1 && store_b[15] == 1)    return false;    int num_a = 0, num_b = 0;    for(i = 1; i <= 15; ++i){        if(store_a[i] >= 4){            num_a = i;            break;        }    }    for(i = 1; i <= 15; ++i){        if(store_b[i] >= 4){            num_b = i;            break;        }    }    if(num_a == 0)  return false;    else if(num_a >= num_b)  return true;    return false;}bool way_6(){    int i, j;    if(way_5()) return true;    if(store_b[14] == 1 && store_b[15] == 1)    return false;    return false;}bool first_out(){    int count = 0;    int i, j, k;    for(i = 1; i <= 15; ++i){        if(store_a[i])  count += store_a[i];    }    if(0 == count){        return true;    } else if(1 == count){        return true;    } else if(2 == count){        if(store_a[14] == 1 && store_a[15] == 1){            return true;        } else{            for(i = 1; i <= 13; ++i){                if(store_a[i] == 2){                    return true;                }            }            if(way_2()) return true;            return false;        }    } else if(3 == count){        for(i = 1; i <= 13; ++i){            if(store_a[i] == 3){                return true;            }        }        if(way_3()) return true;        return false;    } else if(4 == count){        for(i = 1; i <= 15; ++i){            if(store_a[i] >= 3){                return true;            }        }        if(way_4()) return true;        return false;    } else if(5 == count){        int count_a = 0, count_b = 0;        for(i = 1; i <= 15; ++i){            if(store_a[i] == 3) ++count_a;            else if(store_a[i] == 2 && i <= 13) ++count_b;        }        if(count_a && count_b){            return true;        }        if(way_5()) return true;//        return false;    } else if(6 == count){        int count_a = 0;        for(i = 1; i <= 15; ++i){            if(store_a[i] == 4) ++count_a;        }        if(count_a){            return true;        }        if(way_6()) return true;//        return false;    }    if(way_6()) return true;    return false;}void debug(){    for(int i = 1; i <= 15; ++i){        printf("%-2d", store_a[i]);    }    printf("\n");    for(int i = 1; i <= 15; ++i){        printf("%-2d", store_b[i]);    }    printf("\n");}int main(){    int i, j, k, numCase;    scanf("%d",&numCase);    while(numCase--){        scanf("%s",array_a);        scanf("%s",array_b);        init();        //debug();        if(first_out()){            printf("Yes\n");        } else{            printf("No\n");        }    }    return 0;}