九连环C语言程序

最近在玩九连环游戏,就写个九连环程序。


古董九连环

九连环蕴含以下知识:

  • 递归
  • 格雷码
  • 二进制
#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 */
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • .bat脚本基本命令语法 目录 批处理的常见命令(未列举的命令还比较多,请查阅帮助信息) 1、REM 和 :: 2...
    庆庆庆庆庆阅读 12,561评论 1 19
  • 大学的军训真的和高中不一样,真的,一点都不一样。 在进去大学之前就对大学军训的高强度有所耳闻。但也没有特别慌张,总...
    花栗鼠呀花栗鼠阅读 4,021评论 3 4
  • 电影《七十七天》,我觉得可以给它打三颗星。 不得不说七十七天拍摄的景很美,看的时候就好像置身其中,而且大部分景是实...
    _阿黎__阅读 4,046评论 0 0
  • 这会你已经睡了, 我偷偷打开夜的窗子, 看那心花。 梦开始的地方多美好! 有河畔陪着花园, 花园里有冬青,绿竹,晚...
    阿木洛克人阅读 1,131评论 0 2
  • 摘自电子商务系统分析与设计 Web页面设计遵循三条原则:简洁性、一致性和对比度。简称3C原则。 1)简洁性设计并不...
    CK星空阅读 5,614评论 0 0