UVa 11846 Finding Seats Again 题解

Posted alrond

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 11846 Finding Seats Again 题解相关的知识,希望对你有一定的参考价值。

难度:β

建议用时: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

以上是关于UVa 11846 Finding Seats Again 题解的主要内容,如果未能解决你的问题,请参考以下文章

Seats

LightOj 1215 Finding LCM

[Algorithm] Finding all factors of a number

LeetCode - 626. Exchange Seats

LightOJ - 1215 Finding LCM

2020杭电HDU-6756多校第一场Finding a MEX(图的分块)