题目描述:
我们的主角——老曹,现在十分忧郁。原因是他在玩一个困难的游戏。
游戏规则如下:
有(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.