Re: [问题] 自己定义的逻辑用递回来跑要如何思考?

楼主: ACMANIAC (請肥宅救救肥宅)   2015-01-25 06:17:54
※ 引述《hank951 (法克)》之铭言:
: 开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
: C
: 问题(Question):
: 想了解大概要怎么思考这种题型
: 喂入的资料(Input):
: 输入一个整数 例如3或4
: 预期的正确结果(Expected Output):
: if 3
: 000
: 001
: 010
: 011
: 012
: if 4
: 0000
: 0001
: 0010
: 0011
: 0012
: 0100
: 0101
: 0102
: 0110
: 0111
: 0112
: 0120
: 0121
: 0122
: 0123
: 补充说明(Supplement):
: 这种格式若是要思考用递回(backtracking)要怎么下手比较好呢
http://codepad.org/mk3FG9J6
思考完规律以后,可以先想办法把它画成树状图。
level
0 0
/ \
1 0 1
/ \ /|\
2 0 1 0 1 2
... ... /|\....
3 0 1 2
画完以后就可以想想,这图和程式码的关系为何:
1.当前节点是个要印的数字
// int number
2.每条边是 function-call,
所以如果当前节点有 3 条边连接子节点就要放个循环跑 3 遍。
// for (...) { back_tracking(...); }
3.观察规律得知,子节点的数量 是 到目前为止最大数 + 2,
所以循环要跑这么多次。
// if (max_number < number) max_number = number;
// for (i : max_number + 2)
4.在叶节点结束,所以要设终止条件。
// if (level + 1 == depth) { return; }
5.在结束时要把路径上遇到的数字印出来,所以路径上的数字要存进 buffer。
// char buffer[BUFFER_SIZE];
// buffer[level] = '0' + number;
// if (is leaf) { cout << buffer << endl; }
应该很清楚了吧。

Links booklink

Contact Us: admin [ a t ] ucptt.com