天天看点

HDU 5228 ZCC loves straight flush

Problem Description

After losing all his chips when playing Texas Hold'em with Fsygd on the way to ZJOI2015, ZCC has just learned a black technology. Now ZCC is able to change all cards as he wants during the game. ZCC wants to get a Straight Flush by changing as few cards as possible. 

We call a five-card hand a Straight Flush when all five cards are consecutive and of the same suit. You are given a five-card hand. Please tell ZCC how many cards must be changed so as to get a Straight Flush.

Cards are represented by a letter('A', 'B', 'C', 'D') which denotes the suit and a number('1', '2', 

⋯, '13') which denotes the rank.

Note that number '1' represents ace which is the largest actually. "1 2 3 4 5" and "10 11 12 13 1" are both considered to be consecutive while "11 12 13 1 2" is not.

Input

T(T=1000) which denotes the number of test cases.

For each test case, there are five short strings which denote the cards in a single line. It's guaranteed that all five cards are different.

Output

For each test case, output a single line which is the answer.

Sample Input

3

A1 A2 A3 A4 A5

A1 A2 A3 A4 C5

A9 A10 C11 C12 C13

Sample Output

1

2

直接暴力上

#include<iostream>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100005;
int T, n, m, ans, t[4][15];
char s[5];

int main()
{
    while (scanf("%d", &T) != EOF)
    {
        memset(t, 0, sizeof(t));
        for (int i = 0; i < 5; i++)
        {
            scanf("%s", s);
            int k = s[1] - '0';
            if (s[2]) k = k * 10 + s[2] - '0';
            t[s[0] - 'A'][k] = 1;
        }
        ans = 4;
        for (int i = 0; i < 4; i++)
        for (int j = 1; j <= 10; j++)
        {
            int p = 0;
            for (int k = 0; k <= 4; k++)
            if (t[i][(j + k - 1) % 13 + 1]) { p++; ans = min(ans, 5 - p); }
        }
        printf("%d\n", ans);
    }
}