题目链接:http://codeforces.com/contest/1287/problem/B
题意:给你n张牌,每张牌有k种特征,每一种特征只会有三种情况:S,T,E,现在把这些牌按一定规则组成一组,有多少种组发
规则:1.一组有且仅有3张牌2,一组中的牌两两之间他们的每一种特征都不同或者他们有一种或者多种特征相同
这一题做法实在是太巧妙了,代码旁边有详细注释
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<map>
using namespace std;
map<string,int> Map;
int cmp(char a,char b)
{
return (a==b)? a:'S'+'E'+'T'-a-b;//如果一张牌和另一张牌的一种特征相同则返回同一种特征,如果不相同则返回他们所不包含的另一种特征。
}
int main()
{
//n:有多少张牌,m每张牌有多少种特征,sum可组成一组的方法的数量
int n,m,sum=0;
string s[2005];
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
cin>>s[i];
Map[s[i]]=i+1;//把每一张牌标上序号
}
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
string a;
for(int k=0;k<m;k++)//让这一张牌和之后的牌进行比较
{
a+=cmp(s[i][k],s[j][k]);
}
if(Map[a]>j) sum++;//在比较完牌1和牌2之后,我们依照题目的规则构造出了牌3,如果牌3的编号大于牌2,那么证明牌3是存在的,因此方法数+1
}
}
printf("%d\n",sum);
}