小花梨的三角形

    xiaoxiao2022-07-07  191

    题目描述

    小花梨现在有一个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; }

     

     

     

    最新回复(0)