感受颇深的几个题:
1135 奇怪的电梯
广搜
难点:
自己定义一个队列元素的类型,QElement为结构类型,使用typedef可以定义一个新的类型名称,在程序中QElement就像int、float一样,作为一个数据类型的名称使用:
typedef struct {
int floor; //当前所处的楼层编号
int pushcount; //到达该楼层所经历的步数(按按钮次数)
} QElement;
定义队列的时候:
queue<QElement> q; //定义元素类型为QElement的队列q。
1219八皇后
这是一道深搜回溯题,进一步搜索后要清除这一步的标记回到上一步,
难点:
每个皇后占领八个直线方向的格子,横竖的格子容易标记。
题解中给出c[i+j]表示左下到右上
d[i-j+n]表示左上到右下这种方法很巧妙,是我一开始想不到的。
1118
难点:
已知杨辉三角的高度n,用这种数组a[]储存最后一排:
a[0]=a[n-1]=1; //杨辉三角性质,两边都是1
if (n>1)
for (int i=1;i*2<n;i++)
pc[i]=pc[n-1-i]=(n-i)*pc[i-1]/i;
这个方法太妙了,我想不出原理,但是每个数竟然都能算对!
剪枝:
如过排列前面的数的和已经超过了sum,这种情况就要直接舍弃;
我自己动手做时遇到的问题:
我在写递归的时候总是不知道该在哪里走向下一个步,递归函数也不知道应该把哪些变量设置参数,我能理解题解给的思路方法,自己不会写递归。
2196 挖地雷
题目表述没有说明白是通道单向的导致我看了半天没能理解题目。
深搜
这道题也用到了回溯,挖到无路可走的情况就和ans比较,大的话就赋值给ans,
难点:
1.利用bool类型的二维数组储存地窖之间的通道,这是我没想到的,a[2][3]=1表示从二号到三号之间有一个单向通道
2.搜索函数的参数是(现在的位置,走过的总点数,地雷总数)
主函数中输入的参数是(假设从i开始走,1,i处地雷数)
1294 高手散步
难点:
裸的邻接矩阵存储
存储双向的路经:s[a][b]=s[b][a];
思路:
将每个景点都当作初始位置开始深搜(同时这个初始位置记录为搜索过),一直遍历到无路可走(再用max函数判断ans是否更新)
收获:
深搜可以和哪些知识结合:
二叉树,
并查集:奶酪题中遇到
小想法:
搜索函数都是先判断条件(是否遍历到头,是否更新ans,是否还有路可走,根据题目条件而设计的剪枝)再判断向下一步怎么走
回溯一般是在函数调用自身之后,把当前步数的状态清空
用合适的容器存放每一步的状态非常重要,有些情况我们可以巧妙使用二维数组、结构体struct