这道题是从http://blog.csdn.net/fmddlmyy/article/details/7234119#plain看来的。伐木丁丁鸟鸣嘤嘤
伐木丁丁鸟鸣嘤嘤
1. 缘起
岳父大人拿来一张去年的报纸,说有一道很难做的益智题,让我看看,就是下图中的题目:
如果这是一道正常的益智题,岳父大人既然做不出来,我是肯定做不出来的。不过看过题目后,我觉得这个题目就是一个典型的编程作业。把编程作业当作益智题,显然是个恶作剧了。下面简单介绍一下如何编程求解这道题目。
2. 我的解法
这题可以表述如下(因为第一步肯定是2011+7=2018,最后一步肯定是2017-5=2012):
已知x0 = 2018, x1=2017,
f1(x)= (x/2)+7;
f2(x)= (x+7)/2;
f3(x)= (x*3)-5;
f4(x)= (x-5)*3;
并且fa1fa2…fan(x0)= x1,
a1,a2,…,an属于集合{1,2,3,4}。
求a1,a2,…,an.
用程序暴力解法如下:
// Math2012.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <vector> #include <set> #include <windows.h> using namespace std; int f1(int even) { int ret = even / 2 + 7; return ret; } int f2(int odd) { int ret = (odd + 7) / 2; return ret; } int f3(int input) { int ret = (input - 5) * 3; return ret; } int f4(int input) { int ret = input * 3 - 5; return ret; } int _tmain(int argc, _TCHAR* argv[]) { int initial = 2018; int destine = 2017;//2017 674 1334 2661 892 299 584 1154 2301 772 1530 515 1016 std::set<int> seed_array; std::set<int> seed_array_copy; std::set<int>::iterator it; seed_array.insert(initial); bool success = false; while (true) { Sleep(50); printf("seed_array: "); for (it = seed_array.begin(); it != seed_array.end(); ++it) { int temp = *it; printf("%d ", temp); if (temp % 2 == 0) { int ret1 = f1(temp); seed_array_copy.insert(ret1); if (ret1 == destine) { success = true; printf("success. "); break; } } else { int ret2 = f2(temp); seed_array_copy.insert(ret2); if (ret2 == destine) { success = true; printf("success. "); break; } } int ret3 = f3(temp); seed_array_copy.insert(ret3); if (ret3 == destine) { success = true; printf("success. "); break; } int ret4 = f4(temp); seed_array_copy.insert(ret4); if (ret4 == destine) { success = true; printf("success. "); break; } } seed_array = seed_array_copy; seed_array_copy = std::set<int>(); printf(" "); if (success) { break; } } return 0; }
程序是一目了然的,就是最笨的穷举法。这个程序要执行好几遍,第一遍把destine = 2017, 然后就会输出下一个destine = 674, 以此类推,destine = 2017 674 1334 2661 892 299 584 1154 2301 772 1530 515 1016。见下图:
3.结束
有点无聊的题,不知道谁想出来的。