书籍:《像程序员一思考》(修订版-2015)
主要内容:1、摘录
2、习题解答
-------------------------------------------------------------------------------------------------------------------------------------
一、 摘录:
1、 2-3-Luhn算法:
代码和测试:http://blog.csdn.net/manon_des_source/article/details/51728449
二、 习题:
1-1、 数独游戏
在线数独游戏: http://en.oubk.com/DailySudoku/16966/3
解决 中等难度数独游戏的通用计划:1、找到已知数字最多的 行/列/(3*3)区域,根据游戏的约束条件在空格中填入正确的数字。
2、填完一遍之后,如果确实在该 行/列/(3*3)区域 的空格中填入了数字,就根据约束条件重新再填一遍。
一直重复这个步骤,直到该 行/列/(3*3)区域 没有填入任何数字,最后返回步骤1。
3、若该 行/列/(3*3)区域 剩余2个空格,且每个空格都可以填入剩余的2个数中的任何一个,随机填入一种可能,但要满足约束条件。
4、若该 行/列/(3*3)区域 的全部空格都有>=3种可能的数字可以填,那么在其中2个空格中随机填入一种可能,但要满足约束条件。
最后返回步骤1。
1-2、 数字滑块游戏
数字滑块游戏: http://www.4399.com/flash/126673_2.htm
难度翻了1番吧,人们通常只习惯数字序列,而不是文字序列或图片序列,序列很适合使用旋转/火车列的方式移动而不出错。
而图片可以更直观的看出一行(或一列)的图片是否拼好,以至于将n*m阶将为(n-1)*m阶(或n*(m-1)阶),这是好处,数字就需要慢慢数。
1-3、 数字拼图游戏
新的策略-插入法(对于2*3以上的拼图,可以使用如下策略,当拼图评到等于2*3时就不适用了):
1、目的是将数字直接插入正确的位置,通过旋转的方法,如、下面将最左边一列的3个数字直接插入到位:
另外、发现2个无解的拼图:
1-4、 简化问题:
1、重新表述这个问题,将它拆分成多个相联系的小块
2、弱化或去掉一些约束条件
同类迷题:传教士和吃人恶魔问题:https://zh.wikipedia.org/wiki/传教士和吃人恶魔问题
1-5、 陷入僵局时:
1、将问题的约束条件列出来
2、将所有可能的操作列出来
3、简化问题
4、寻找雷同的问题
-------------------------------------------------------------------------------------------------------------------------------------
2-1、 8*4倒三角
任务列表:
1、生成8*4矩阵
2、生成8*4斜三角
3、生成8*4正三角
void print_8_4_triangle(void)
{
int line = 0;
int row = 0;
#define step_2_1 2
cout << "print_8_4_triangle:" <<endl;
#if (step_2_1 == 1)
for(line = 0; line < 4; line++)
{
for(row = 0; row < 8; row++)
{
cout << '#';
}
cout <<endl;
}
#elif (step_2_1 == 2)
for(line = 4; line > 0; line--)
{
for(row = 0; row < 2 * line; row++)
{
cout << '#';
}
cout <<endl;
}
#elif (step_2_1 == 3)
#else
cout << "error" <<endl;
#endif
}