# 一个小程序

#include <stdio.h>
#include <stdlib.h>

enum {pos_input = 0, pos_middle, pos_output};
enum {in_up = 0, in_down, left_up, right_up, left_down, right_down, out_up, out_down};

char *pos_string[] = {"up +7", "down /2",
"left_up +7", "right_up *3", "left_down /2", "right_down -5",
"up *3", "down -5"};

#define MAX_STEPS 1000
#define MAX_SOLUTIONS 1

int positions[MAX_STEPS];
int directions[MAX_STEPS];
long long ns[MAX_STEPS];
int max_step;
int solutions;

void print_solution()
{
int i;
printf("down. max_step = %d.\n", max_step);
for (i=0; i<=max_step; i++) {
printf("step: %d, pos: %d, n: %llu, direction: %s\n",
i, positions[i], ns[i], pos_string[directions[i]]);
}
printf("\n");
}

void calc(int step, long long n, int pos, int direction)
{
if (step > max_step) return;
positions[step] = pos;
directions[step] = direction;
ns[step] = n;

switch (pos) {
case pos_input:
switch (direction) {
case in_up:
calc(step + 1, n + 7, pos_middle, right_up);
calc(step + 1, n + 7, pos_middle, right_down);
calc(step + 1, n + 7, pos_middle, left_down);
break;
case in_down:
calc(step + 1, n / 2, pos_middle, right_up);
calc(step + 1, n / 2, pos_middle, right_down);
calc(step + 1, n / 2, pos_middle, left_up);
break;
default:
printf("error: case pos_input - switch (direction), direction = %d.\n", direction);
exit(1);
}
break;

case pos_middle:
switch (direction) {
case left_up:
calc(step + 1, n + 7, pos_input, in_down);
break;
case left_down:
calc(step + 1, n / 2, pos_input, in_up);
break;
case right_up:
calc(step + 1, n * 3, pos_output, out_down);
break;
case right_down:
calc(step + 1, n - 5, pos_output, out_up);
break;
}
break;

case pos_output:
if (2012 == n) {
print_solution();
solutions ++;
if (MAX_SOLUTIONS == solutions) {
exit(0);
}
}
switch (direction) {
case out_up:
calc(step + 1, n * 3, pos_middle, right_down);
calc(step + 1, n * 3, pos_middle, left_up);
calc(step + 1, n * 3, pos_middle, left_down);
break;
case out_down:
calc(step + 1, n - 5, pos_middle, right_up);
calc(step + 1, n - 5, pos_middle, left_up);
calc(step + 1, n - 5, pos_middle, left_down);
break;
default:
printf("error: pos_output - switch (direction), direction = %d\n", direction);
exit(1);
}
break;

default:
printf("error: switch (pos), directionpos = %d.\n", pos);
exit(1);
}
}

int main()
{
solutions = 0;

for (max_step = 2; max_step < MAX_STEPS; max_step++) {
calc(0, 2011, pos_input, in_down);
calc(0, 2011, pos_input, in_up);
}
return 0;
}


• 本文已收录于以下专栏：

## 微信小程序-仿 「ONE · 一个」 的微信小程序

• sinat_17775997
• 2017年01月05日 20:44
• 998

## 写的一个定时小程序

无标题文档    option explicit    dim dhour,dminute,dsecond dim strinfor function propInfor()    document...
• mufengwsp2004
• 2007年06月26日 15:57
• 517

## 【小程序】请编写一个函数，删除一个字符串的一部分

《c和指针》习题6.2请编写一个函数，删除一个字符串的一部分，函数的原型如下：intdel_substr(char*str,char const *substr)函数首先应该判断substr是否出现在...
• zhangzm0128
• 2016年09月24日 17:45
• 503

## Extd第一个gridPanel小程序

• ItJavawfc
• 2014年09月11日 09:37
• 653

## Spring boot入门小程序

• u012050154
• 2017年08月16日 17:01
• 291

## 一个收到微信小程序内测的号，竟然300万起拍卖

• zhangdaiscott
• 2016年09月25日 12:39
• 1885

## （一）如何新建一个微信小程序

• 2017年01月06日 10:34
• 6088

## 小程序入门（0）项目创建篇

• yan_chenyu
• 2016年10月02日 14:37
• 1136

## 编写了一个计算器小程序，作为栈的练习

• cjbct
• 2016年12月07日 19:53
• 1330

## 微信小程序怎么申请 从零开始做一个微信小程序教程

• xz_src
• 2017年06月15日 10:21
• 1304

举报原因： 您举报文章：一个小程序 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)