感觉好久没写博客了 , 写个水题开心一下。
题意: 用最少的步骤将手牌换成同花顺 , 直接枚举了,反正牌不多,全部的同花顺也就大概50种 然后枚举看看每个同花个当前手牌差多少 ,找个最小的,数据小,直接过了,
代码:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<map>
using namespace std;
map<string, int> mymap;
char s1[20], mmap[100][30];
int coun;
int sm(int a, int b)
{
if(a < b) return a;
return b;
}
int ok(int x)
{
int sum = 0, k1, k2;
char s2[20];
if(mmap[x][1] == '1')
{
memset(s2, '\0', sizeof(s2));
strcat(s2 ,mmap[x]);
if(!mymap[mmap[x]]) sum = 1;
for(int i = 1; i < 5; i++)
{
s2[strlen(s2)-1] ++;
if(!mymap[s2]) sum++;
}
k1 = sum, sum = 0;
if(!mymap[mmap[x]]) sum = 1;
memset(s2, '\0', sizeof(s2));
strcat(s2 ,mmap[x]);
s2[1] = '9';
for(int i = 1; i < 5; i++)
{
if(s2[1] == '9') {s2[1] = '1', s2[2] = '0';if(!mymap[s2]) sum++; continue;}
s2[strlen(s2)-1] ++;
if(!mymap[s2]) sum++;
}
k2 = sum, sum = 0;
k1 = sm(k1, k2);
return k1;
}
memset(s2, '\0', sizeof(s2));
strcat(s2 ,mmap[x]);
if(!mymap[mmap[x]]) sum = 1;
for(int i = 1; i < 5; i++)
{
if(s2[1] == '9') {s2[1] = '1', s2[2] = '0';if(!mymap[s2]) sum++; continue;}
s2[strlen(s2)-1] ++;
if(!mymap[s2]) sum++;
}
return sum;
}
int main()
{
int T;
coun = 0;
for(int i = 0; i <= 4; i++)
{
for(int j = 1; j <= 9; j++)
{
mmap[coun][0] = ('A' + i);
mmap[coun][1] = (j + '0');
// printf("%s\n", mmap[coun]);
coun ++;
}
}
scanf("%d", &T);
while(T--)
{
mymap.clear();
for(int i = 0; i < 5; i++)
{
scanf("%s", s1);
mymap[s1] = 1;
}
int minn = 1000000000;
for(int i = 0; i < coun; i++)
{
int k = ok(i);
minn = sm(k, minn);
}
printf("%d\n", minn);
}
}