こんなツイートをした以上は自分が書かないと怒られそうなので書いてみる。
#include <stdio.h> #include <stdlib.h> void select_char(char * buf, int pos) { int i, c; if(pos == 9) { buf[pos] = '\0'; printf("%s\n", buf); return; } // 2文字目までは連続のチェック不要 if(pos < 2) { for(i = 'A'; i <= 'Z'; i++) { buf[pos] = i; select_char(buf, pos + 1); } return; } // 直前二つが同じ文字の場合は、踏んではいけない文字を決め、 // その直前までとその直後からについて処理する。ループの中でif文を使いたくないので。 c = 'A'; if(buf[pos - 1] == buf[pos - 2]) { c = buf[pos - 1]; for(i = 'A'; i < c; i++) { buf[pos] = i; select_char(buf, pos + 1); } c++; } for(i = c ; i <= 'Z'; i++) { buf[pos] = i; select_char(buf, pos + 1); } } int main(int argc, char **argv) { char buf[10]; select_char(buf, 0); return EXIT_SUCCESS; }