プログラム大喜利

Twitter. It's what's happening.

こんなツイートをした以上は自分が書かないと怒られそうなので書いてみる。

#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;
}