最近在玩九连环游戏,就写个九连环程序。
九连环蕴含以下知识:
- 递归
- 格雷码
- 二进制
#include <stdio.h>
typedef enum {
DOWN,
UP
} direction;
#define DISP(d) (d == UP ? "Up " : "Down")
char charDirection(direction d) {
return d == UP ? '1' : '0';
}
direction reverse(direction d) {
return d == DOWN ? UP : DOWN;
}
void upDownOne(char *p, int n, direction d) {
*(p + n) = charDirection(d);
printf("%s %d %s \n", DISP(d), n, p);
}
void upDownMultiple(char *p, int n, direction d) {
if (n == 1) {
*(p + 1) = charDirection(d);
printf("%s 1 %s \n", DISP(d), p);
return;
} else if (n == 2) {
*(p + 1) = charDirection(d);
*(p + 2) = charDirection(d);
printf("%s 12 %s \n", DISP(d), p);
return;
}
upDownMultiple(p, n - 2, d);
upDownOne(p, n, d);
direction u = reverse(d);
upDownMultiple(p, n - 2, u);
upDownMultiple(p, n - 1, d);
}
int main() {
char ring[11] = " 111111111";
upDownMultiple(ring, 9, DOWN);
return 0;
}
/* output
Down 1 011111111
Down 3 010111111
Up 1 110111111
...
Up 1 110000000
Down 12 000000000 */