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 long
using 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;
}

 

转载于:https://www.cnblogs.com/wushuaiyi/p/3902867.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值