题目描述
小花梨现在有一个n层三角形图(参考下图),第i层有2i−1个边长为1的等边三角形。 每个交点处存在一个字符,总共有n+1层字符,第i层有i个字符。 小花梨用等边三角形三个顶点上的字符来表示这个三角形,两个等边三角形如果它们的三个顶点字符相同(不区分顺序)则视为同一类等边三角形。小花梨想知道总共存在多少种不同类别的等边三角形。
输入
第一行为正整数n,表示三角形层数(1≤n≤100)。 接下来n+1行,第i行输入i个字符,表示第i层的字符。(字符只包含小写字母"a−z")
输出
输出一个整数表示存在多少种不同类别的三角形
样例输入
1
a
bc
样例输出
1
提示
只存在顶点为(a,b,c)的三角形
题目中三角分为正三角和倒三角,并且三角形的大小也不同,需要控制的范围不容易掌控,还有map的一种新用法
map<string,int> p;
char x[5];
x=map;
printf("%d",p.count(x));
表示输出x这个字符串是否出现过,若出现过输出1,否则输出0
实现代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
int main()
{
map<string,int> m;
int n,ans=0;;
char x[105][105];
char q[4];
scanf("%d",&n);
for(int i=0;i<=n;i++)
{
scanf("%s",x[i]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<=i;j++)
{
for(int k=i+1;k<=n;k++)
{
q[0]=x[i][j];
q[1]=x[k][j];
q[2]=x[k][k-i+j];
sort(q, q+3);
if(m.count(q)==0)
{
m[q]=1;
ans++;
}
}
}
}
for(int i=1;i<n;i++)
{
for(int j=0;j<i;j++)
{
for(int k=j+1;k+i-j<=n && k<=i;k++)
{
q[0]=x[i][j];
q[1]=x[i][k];
q[2]=x[i+k-j][k];
sort(q, q+3);
if(m.count(q)==0)
{
m[q]=1;
ans++;
}
}
}
}
printf("%d\n",ans);
return 0;
}