老曹的忧郁

题目描述:

 我们的主角——老曹,现在十分忧郁。原因是他在玩一个困难的游戏。
  游戏规则如下:
  有(N+1)*n/2个圆盘,在平面上摆成了一个变长为N个圆盘的等边三角形。每个圆盘上标有一个小写字母(‘a’_’z’),如下图所示。
  这里写图片描述
  对于每个字母,当我们可以由标为这个字母的圆盘为顶点,构成等边三角形时,我们称这个字母为不和谐的。例如途中的a和c。
  现在给你N和这个等边三角形上的字母,要求哪些字母是不和谐的。
  

输入数据:

第一行:一个整数,N(1<=N<=12)
第二行:(N+1)*N/2个小写字母
样例输入1:
3
aaaaaa
样例输入2:
3
abcdef

输出数据:

第一行:一个整数,N(1<=N<=12)
第二行:(N+1)*N/2个小写字母
样例输出1:
a
样例输出2:
Harmonious  

题解:

其实这道题很简单……
以第一个点为原点建立平面直角坐标系,圆形半径为1如图:
这里写图片描述
每一个点都可以算出下一层的两个点的坐标
这里写图片描述
红线长度为1,蓝线长度为2,绿线可以根据勾股定理算出。
在坐标生成完后,枚举三个点,用勾股定理算出三条边的距离,判断即可。
要注意精度

code:

var
        i,j,k,n,m:longint;
        x,y,z:real;
        a:array[1..500,1..2] of real;
        b:array[0..500] of char;
        bz:array['a'..'z'] of boolean;
        c:char;
        l:boolean;
begin
    readln(n);
    m:=((n+1)*n) div 2;
    for i:=1 to m do
    begin
        read(b[i]);
    end;
    a[1,1]:=0;
    a[1,2]:=0;
    x:=sqrt(sqr(2)-sqr(1));
    for i:=1 to n-1 do
    begin
        for j:=1 to i do
        begin
            inc(k);
            a[k+i,2]:=a[k,2]-x;
            a[k+i,1]:=a[k,1]-1;
            a[k+i+1,2]:=a[k,2]-x;
            a[k+i+1,1]:=a[k,1]+1;;
        end;
    end;
    for i:=1 to m do
        for j:=1 to m do
                for k:=1 to m do
                begin

                    if (i<>j) and (j<>k) and (i<>k) then
                    begin
                        if (i=42) and (j=33) and (k=34) then
                    begin
                        write;
                    end;
                        if a[i,1]=a[j,1] then
                        begin
                            x:=abs(a[i,2]-a[j,2]);
                        end
                        else
                        begin
                            if a[j,2]=a[i,2] then
                            begin
                                x:=abs(a[i,1]-a[j,1]);
                            end
                            else x:=sqrt(sqr(abs(a[i,1]-a[j,1]))+sqr(abs(a[i,2]-a[j,2])));

                        end;
                        if a[i,1]=a[k,1] then
                        begin
                            y:=abs(a[i,2]-a[k,2]);
                        end
                        else
                        begin
                            if a[k,2]=a[i,2] then
                            begin
                                y:=abs(a[i,1]-a[k,1]);
                            end
                            else y:=sqrt(abs(sqr(abs(a[i,1]-a[k,1]))+sqr(abs(a[i,2]-a[k,2]))));
                        end;
                        if a[j,1]=a[k,1] then
                        begin
                            z:=abs(a[j,2]-a[k,2]);
                        end
                        else
                        begin
                            if a[k,2]=a[j,2] then
                            begin
                                z:=abs(a[j,1]-a[k,1]);
                            end
                            else z:=sqrt(abs(sqr(abs(a[j,1]-a[k,1]))+sqr(abs(a[j,2]-a[k,2]))));
                        end;
                        x:=trunc((x-0.000000)*1000000);
                        y:=trunc((y-0.000000)*1000000);
                        z:=trunc((z-0.000000)*1000000);
            if (x=y) and (y=z) then
            begin
                    if (b[i]=b[j]) and (b[j]=b[k]) then
                    begin
                            bz[b[i]]:=true;
                    end;
            end;

                    end;
                end;
    for c:='a' to 'z' do
    begin
        if bz[c] then
        begin
            write(c);
                        l:=true;
        end;
    end;
        if l=false then
        begin
            writeln('Harmonious');
        end;
end.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值