ABCを並べて
ちょっと拾ったソース
A,B,C,D,E,Fの6文字のうち、3文字を使って出来る文字列を列挙せよ
総数は6P3 = 120個ある
#include <stdio.h>
void go(char s[4],int flag,int i)
{
int j;
if (i == 3) {
puts(s);
return;
}
for(j = 0;j < 6;++j) {
if (!(flag&(1<<j))) {
s[i] = j + 'A';
go(s, flag|1<<j, i+1);
}
}
}
int main(void)
{
char s[4];
s[3] = '\0';
go(s, 0, 0);
return 0;
}
こういうタイプの列挙問題って初歩的なものなんだろうけど、いざソースを書こうとすると結構難しかったりするんだよなぁ。
上のソースは宿題片付けますスレに貼られていたものなんですが、凄い単純なプログラムだと思う。まだまだ初心者を抜け出せない自分ですが、『あぁ~、なるほどぉ』と思うようなソースです。
上手いソースは結構ビット演算とかもつかってるんだなぁ・・・と思う訳ですよ。
既に使用した文字をint型変数flagの特定のビットを立てることで表現したりすんのは結構面白いと思う。int型だから大体の環境なら4バイト=32ビット。つまりアルファベット全部使った○文字の文字列の列挙とかも出来る訳だ。
アルファベットだけじゃなく、並べたいもの(文字列、数値etc...)を配列とかにgo関数内で配列に確保しておいて、
s[i] = j + 'A';
のところをちょっと書き換えれば、また面白いものが出来るかも。
あぁ~、こういうタイプのソースコードいっぱい置いてあるところないかなぁ~
俺じゃ作れねぇもんなぁ~
A,B,C,D,E,Fの6文字のうち、3文字を使って出来る文字列を列挙せよ
総数は6P3 = 120個ある
#include <stdio.h>
void go(char s[4],int flag,int i)
{
int j;
if (i == 3) {
puts(s);
return;
}
for(j = 0;j < 6;++j) {
if (!(flag&(1<<j))) {
s[i] = j + 'A';
go(s, flag|1<<j, i+1);
}
}
}
int main(void)
{
char s[4];
s[3] = '\0';
go(s, 0, 0);
return 0;
}
こういうタイプの列挙問題って初歩的なものなんだろうけど、いざソースを書こうとすると結構難しかったりするんだよなぁ。
上のソースは宿題片付けますスレに貼られていたものなんですが、凄い単純なプログラムだと思う。まだまだ初心者を抜け出せない自分ですが、『あぁ~、なるほどぉ』と思うようなソースです。
上手いソースは結構ビット演算とかもつかってるんだなぁ・・・と思う訳ですよ。
既に使用した文字をint型変数flagの特定のビットを立てることで表現したりすんのは結構面白いと思う。int型だから大体の環境なら4バイト=32ビット。つまりアルファベット全部使った○文字の文字列の列挙とかも出来る訳だ。
アルファベットだけじゃなく、並べたいもの(文字列、数値etc...)を配列とかにgo関数内で配列に確保しておいて、
s[i] = j + 'A';
のところをちょっと書き換えれば、また面白いものが出来るかも。
あぁ~、こういうタイプのソースコードいっぱい置いてあるところないかなぁ~
俺じゃ作れねぇもんなぁ~