sub wgc {
return if $seen{"@_"}++;
my%x=@_;
if ($x{b} && $x{c} && $x{g} && $x{w}) {
print+(sort keys%$_),"\n" for @h;
exit;
} elsif ((!$x{b} && ($x{c} && $x{g} || $x{g} && $x{w})) ||
($x{b} && (!$x{c} && !$x{g} || !$x{g} && !$x{w}))) {
return;
} else {
if ($x{b}) {
delete $x{b};
for ('xx', keys %x) {
my %y=%x;
delete $y{$_};
local @h=(@h, \%y);
wgc(%y);
}
} else {
$x{b}=1; {
local (@h) = (@h, \%x);
wgc(%x);
}
for my $k (qw(c g w)) {
if (!$x{$k}) {
my %y=(%x,$k,1);
local (@h) = (@h, \%y);
wgc(%y);
};
}
}
}
}
wgc
####
bg
g
bcg
c
bcw
cw
bcgw
##
##
sub w{return if$s{"@_"}++;my%x=@_;if($x{b}&$x{c}&$x{g}&$x{w}){print+(sort keys%$_),"\n"for@h;exit;}elsif(($x{b}||!($x{c}&&$x{g}||$x{g}&&$x{w}))&&(!$x{b}||!(!$x{c}&&!$x{g}||!$x{g}&&!$x{w}))){if($x{b}){delete$x{b};for(A,keys%x){my%y=%x;delete$y{$_};local@h=(@h,\%y);w(%y)}}else{$x{b}=1;{local@h=(@h,\%x);w(%x);}for(qw(c g w)){if(!$x{$_}){my%y=(%x,$_,1);local@h=(@h,\%y);w(%y)}}}}}w