难度:β
建议用时:40 min
实际用时:1 h
题目:??
代码:??
这题我又是在很短时间 A 过去。
因为我又看别人的题解了。
这题用 DFS 搜索,剪枝没什么的。
搜索方案就是从一个固定点开始往下往右(根据我自己的坐标系来看)拉出一个矩型,然后判断有几个队长,符不符合队长要求的人数条件,然后吧啦吧啦继续搜。
很简单的(看完题解后的我想到)。
就是在处理矩形上面要注意一下细节。剪枝就是减掉枚举时矩形的边的范围,使新画的矩形不会和之前的重合。
我好奇的是为什么只剪列,不剪行。这个细节值得思考。
因为剪行跟不剪是一样的。如果下面一行有矩形了,那么当前矩形就不得不退出。因为它的下界被封住了。
剪列就是限制右界。
其实只要想像一下在几何画板里拉矩形的画面就很好理解了。
至于统计矩形内部的队长有几个,队长举的数字是多少,这个就简单了。没什么说的。
另外一个,根据我看的题解,他限制了矩形的面积不超过 9。很好奇。
还有一处细节也卡了一下。
int num = 10; bool over = false; for (int i = cr; i <= r; i++) { for (int j = cc; j <= c; j++) { if (seats[i][j] != ‘.‘) { if (num != 10) over = true; num = seats[i][j] - ‘0‘; } } if (over) break; } if (over) { lim_c = c; break; } if (num < sum) { lim_c = c; break; } if (num > sum) continue;
这里在统计数字时,预先设定一个数,而且要保证这个数不会出现在队长手上。
因为后面是这样处理的:如果记的数(前提是记了唯一一个队长的数)大于目前矩形的面积,就继续枚举,扩大面积。
如果小于面积,就剪枝,加一行继续枚举矩形。
如果一个队长都没有,则当作情况一,继续搜索。
从字面上看,好像是记的数大于面积,实际上根本没有计数。然而之后的处理是一样的。这就是这里巧妙的地方。
2018-01-30