In reply to gotlibhaim:
I forgot that the dist constraint is not a hard constraint. Try re-writing as
constraint c1 { foreach(pA[i]) if(pA[i] == C) pB[i] inside {C,D}; }
constraint c2 { foreach(pB[i]) if(pB[i] == C) pA[i] inside {C,D}; }
Which gives me
# C D
# C D
# C C
# D B
# A A
# D D
# A B
# C C
# B B
# D A
# A D
# C D
# D C
# B D
# C C
# A A
# C D
# A A
# C D
# B D
# B A
# D C
# B D
# B D
# D B
# C D
# A B
# B B
# A A
# A B
# D A
# A A
# D C
# C C
# D C
# D D
# A A
# C C
# A D
# A A
# B A
# D C
# D A
# D D
# A B
# B B
# B B
# C D
# B D
# A B