HDU4930-Fighting the Landlords

來源:互聯網
上載者:User

標籤:style   blog   color   os   io   for   2014   ar   

題意:鬥地主,就是要自己出牌,使得對手在這一輪無法出牌,或者有出牌的可能,但是你的牌已經走完了。如果符合這些條件的話,輸出Yes,否則輸出No。


思路:先預先處理能直接把牌走完的情況,如果不行的話就直接暴力枚舉能獲勝的情況。


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 20;char s1[MAXN], s2[MAXN];int p1[MAXN], p2[MAXN], num1[MAXN], num2[MAXN];void change(char ch, int *p) {    if (ch == 'Y') p[17] = 1;    else if (ch == 'X') p[16] = 1;    else if (ch == '2') p[15]++;    else if (ch == 'A') p[14]++;    else if (ch == 'K') p[13]++;    else if (ch == 'Q') p[12]++;    else if (ch == 'J') p[11]++;    else if (ch == 'T') p[10]++;    else p[ch - '0']++;  }void count(int n, int *num) {    if (n == 1) num[1]++;    else if (n == 2) num[2]++;    else if (n == 3) num[3]++;    else if (n == 4) num[4]++;}int slove(int n) {    if (n == 1) return 1;    else if (n == 2 && num1[2]) return 1;     else if (n == 2 && p1[16] && p1[18]) return 1;     else if (n == 3 && num1[3]) return 1;    else if (n == 4 && (num1[4] || (num1[3] && num1[1]))) return 1;    else if (n == 5 && num1[3] && num1[2]) return 1;     else if (n == 6 && num1[4]) return 1;    return 0;}int main() {    int cas;    scanf("%d", &cas);    while (cas--) {        scanf("%s%s", s1, s2);         int l1 = strlen(s1);        int l2 = strlen(s2);        memset(p1, 0, sizeof(p1));        memset(p2, 0, sizeof(p2));        for (int i = 0; i < l1; i++)             change(s1[i], p1);        for (int i = 0; i < l2; i++)            change(s2[i], p2);        memset(num1, 0, sizeof(num1));        memset(num2, 0, sizeof(num2));        for (int i = 0; i < 18; i++)             count(p1[i], num1);         for (int i = 0; i < 18; i++)             count(p2[i], num2);         int flag = 0;        if (l1 <= 6) //判斷是否能直接把牌走完的情況            flag = slove(l1);                  if (flag) {            printf("Yes\n");            continue;        }        if (p1[16] && p1[17]) { //判斷雙方是否存在一方有王炸的情況            printf("Yes\n");            continue;         }        if (p2[16] && p2[17]) {            printf("No\n");            continue;         }        if (num1[4]) {  //判斷炸的存在的情況            int a = 1, b = 1;            for (int i = 18; i >= 3; i--)                 if (p1[i] == 4) {                    a = i;                    break;                }            for (int i = 18; i >= 3; i--)                 if (p2[i] == 4) {                    b = i;                    break;                }            if (a > b)                flag = 1;            if (b > a)                  flag = -1;        }        if (flag == 1) {            printf("Yes\n");            continue;        }        if (flag == -1) {            printf("No\n");            continue;        }        int c = 0;  //判斷之存在對手有炸的情況        for (int i = 18; i >= 3; i--)             if (p2[i] == 4) {                c = 1;                break;            }        if (c) {            printf("No\n");            continue;        }        if (num1[3]) {  //判斷有三帶能否直接獲勝的情況            int a = 1, b = 1;            for (int i = 18; i >= 3; i--)                 if (p1[i] == 3) {                    a = i;                    break;                }            for (int i = 18; i >= 3; i--)                 if (p2[i] == 3) {                    b = i;                    break;                }            if (num1[2] && !num2[2]) {                flag = 1;             }            if (a > b)                flag = 1;         }        if (num1[2]) {  //判斷出對子能否直接獲勝的情況            int a = 1, b = 1;            for (int i = 18; i >= 3; i--)                 if (p1[i] == 2 || p1[i] == 3) {                    a = i;                    break;                }            for (int i = 18; i >= 3; i--)                 if (p2[i] == 2 || p2[i] == 3) {                    b = i;                    break;                }            if (a >= b)                flag = 1;         }        if (num1[1]) {  //判斷出單能否直接獲勝的情況            int a = 1, b = 1;            for (int i = 18; i >= 3; i--)                 if (p1[i]) {                    a = i;                    break;                }            for (int i = 18; i >= 3; i--)                 if (p2[i]) {                    b = i;                    break;                }            if (a >= b)                flag = 1;         }        if (flag)            printf("Yes\n");        else            printf("No\n");    }    return 0;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.