一个小程序

原创 2012年11月08日 20:18:16

微博上看到一个好玩编程题目,不太大,正好下班前简单写个。


题目:http://weibo.com/1915548291/z4eTPtAnv


结果:



代码,C语言,在 cygwin 下调试通过


#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);
  }
  printf("not found.\n");
  return 0;
}



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

实例源码 仿 「ONE · 一个」 的微信小程序 项目描述 基于微信开发的仿「ONE · 一个」的微信小程序 项目中的部分静态资源来自 ReactNat...
  • sinat_17775997
  • sinat_17775997
  • 2017年01月05日 20:44
  • 998

写的一个定时小程序

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

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

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

Extd第一个gridPanel小程序

这个小程序中包含了很多的
  • ItJavawfc
  • ItJavawfc
  • 2014年09月11日 09:37
  • 653

Spring boot入门小程序

在Java后台开发过程中有很多框架可供选择,其中应用最为广泛的是SpringMVC以及SpringMVC的升级版SpringBoot。SpringBoot相对SpringMVC,大大减化了XML文件的...
  • u012050154
  • u012050154
  • 2017年08月16日 17:01
  • 291

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

一个收到微信小程序内测的号,竟然300万起拍卖
  • zhangdaiscott
  • zhangdaiscott
  • 2016年09月25日 12:39
  • 1885

(一)如何新建一个微信小程序

最近微信小程序蛮火的,我自己也开始了微信小程序的学习之路,在这里记下学习中遇到的问题,总结项目过程中的知识点,希望在帮助自己总结知识的同时也能帮助到有需要的小伙伴。 下面来讲一下新手如何创建一个微信...
  • nongweiyilady
  • nongweiyilady
  • 2017年01月06日 10:34
  • 6088

小程序入门(0)项目创建篇

已经创建项目的可以看我另一篇讲解 小程序入门讲解 (1)项目结构篇。 官方下载地址 安装后扫描登入。 添加项目 你应该是没有APPID的 选择无APPID 会缺少一项功能后面讲解(...
  • yan_chenyu
  • yan_chenyu
  • 2016年10月02日 14:37
  • 1136

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

一个计算器小程序的实现。用户可以及时输入,然后将用户输入的表达式(中缀表达式)转换成后缀表达式,然后计算。...
  • cjbct
  • cjbct
  • 2016年12月07日 19:53
  • 1330

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

微信小程序申请前的准备: 首先,你需要注册一个小程序账号。需要用一个没注册过公众号的邮箱注册。注册过程中需要很多认证,比较繁琐。如果暂时只是试水、没有发布的打算,那么只要完成基本信息填写就可以,...
  • xz_src
  • xz_src
  • 2017年06月15日 10:21
  • 1304
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个小程序
举报原因:
原因补充:

(最多只允许输入30个字)