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);
}
}