このブログを検索

2013/03/21

10個のマスのうち3個を塗りつぶすパターンをすべて示す

perlでなくもなんでもいいのだが、

「10個のマスのうち3個を塗りつぶすパターンをすべて示す」

というプログラムを書きたい。

マスというのは配列でも文字列でもなんでもよい。

oooxxxxxxx

ooxoxxxxxx

ooxxoxxxxx

....

という事である。

別に必要にせまられているわけではないが、こういうのはプログラムでやるのが得意で、頭の体操にもなるし、と書きかけたのだがうまい案が思いつかない。

再帰をつかうといいのかな?

とりあえず、なんとかできた。

$num = 10;

$x=0;
$y=1;
$z=2;

$count=0;

while($x<($num-2)){
$count++;
for($i=0;$i<$num;$i++){
$array[$i]=0;
}

$array[$x]=1;
$array[$y]=1;
$array[$z]=1;

printf("%8d: ", $count);
print @array;
print "\n";

$z++;
if($z>($num-1)){
$y++;
$z=$y+1;
if($y>($num-2)){
$x++;
$y=$x+1;
$z=$y+1;
}
}
}


もっとエレガントな書き方はあるだろう。

この書き方だと、マス数の変化には対応できるが塗りつぶすマス数の変化には対応できない。