|
本帖最后由 newkid 于 2023-2-16 05:43 编辑
当 N 为奇数,先用前述方法把 N-1 的陀螺状物体构造出来。
选择底座上四个点CDEF,考察两个三角形ACD和AEF(其实任何两个同颜色的三角形都可以, 不妨假设这两个是红色)
对这两个三角形进行替换, 颜色不变, ACD换成ACE, AEF换成ADF
替换后, AD和AE这两条边被两个三角形互换, 颜色依然保持平衡。
不平衡的边是CD,EF,各自缺少一条红色边; 而新增的两条交叉的边CE和DF只有红色,各自缺少一条蓝色边。
除此之外所有三角形的边都保持平衡。
为了更加容易想象,把EF扭转一下,位置对换,底座变成四边形CDFE, 这样就不会交叉,四条边刚好两种颜色交错出现。
经过上述拓扑等价变换,现在把最后一个点, N点加进去, 以CDFE为底座, 补进去四条边, 形成四个新的三角形,两红两蓝,颜色交错, 四条侧边的颜色正好相互平衡,而底部四条边和上一步骤的颜色恰好平衡。
NCD红色, NDF蓝色, NFE红色, NCE蓝色
这样的话,所有的点都被覆盖,所有的边都颜色平衡了。
奇数N写成SQL构造方法:
奇数:
VAR N NUMBER;
EXEC :N:=9;
create table r13 (tri varchar2(3),grp number);
insert into r13
with v as (--- 所有顶点,AB去掉做陀螺的两个顶点,剩下的围城圆环,为了首位相接最后拼上一个字母C
(select replace(sys_connect_by_path(chr(66+level),','),',')||'C' v
from dual
where level=:N-3
connect by level<=:N-3)
)
,r1 as (
select v1||v3 tri,mod(grp1+grp2,2) grp
from (
select substr(v,level,2) v3, mod(level,2) grp1
from v
connect by level<=:N-3
)
cross join (select 'A' v1,0 grp2 from dual union all select 'B',1 from dual)
)
select decode(tri,'ACD','ACE','AEF','ADF',tri) as tri
,grp
from r1
UNION ALL SELECT CHR(64+:N)||'CD',1 FROM DUAL
UNION ALL SELECT CHR(64+:N)||'DF',0 FROM DUAL
UNION ALL SELECT CHR(64+:N)||'EF',1 FROM DUAL
UNION ALL SELECT CHR(64+:N)||'CE',0 FROM DUAL
;
select * from r13;
TRI GRP
--- ----------
ACE 1
BCD 0
ADE 0
BDE 1
ADF 1
BEF 0
AFG 0
BFG 1
AGH 1
BGH 0
AHC 0
BHC 1
ICD 1
IDF 0
IEF 1
ICE 0
16 rows selected.
---- 检验条件2, 所有点都被两种颜色覆盖到,次数不限
WITH
d as (select tri,substr(tri,n,1) d, grp from r13,(select level n from dual connect by level<=3))
select d,grp,count(*)
from d
group by d,grp
order by 1,2
;
D GRP COUNT(*)
---- ---------- ----------
A 0 3
A 1 3
B 0 3
B 1 3
C 0 3
C 1 3
D 0 3
D 1 3
E 0 3
E 1 3
F 0 3
F 1 3
G 0 2
G 1 2
H 0 2
H 1 2
I 0 2
I 1 2
18 rows selected.
---- 检验条件3, 任意点构成的边被两种颜色覆盖次数一样多
WITH d1 as (select tri
,decode(n,1,substr(tri,1,2),2,substr(tri,2,2),substr(tri,1,1)||substr(tri,3,1)) as e
,grp
from r13,(select level n from dual connect by level<=3)
)
,d as (
select least(substr(e,1,1),substr(e,2,1))||greatest(substr(e,1,1),substr(e,2,1)) e,grp from d1 ----将每条边两个字母进行排序
)
select e,count(decode(grp,1,1)) c1,count(decode(grp,0,1)) c2
from d
group by e
order by 1
;
E C1 C2
-------- ---------- ----------
AC 1 1
AD 1 1
AE 1 1
AF 1 1
AG 1 1
AH 1 1
BC 1 1
BD 1 1
BE 1 1
BF 1 1
BG 1 1
BH 1 1
CD 1 1
CE 1 1
CH 1 1
CI 1 1
DE 1 1
DF 1 1
DI 1 1
EF 1 1
EI 1 1
FG 1 1
FI 1 1
GH 1 1
24 rows selected.
|
|