码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 11846 Finding Seats Again 题解

时间:2018-01-31 00:52:54      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:坐标系   chap   https   退出   自己   master   href   ble   html   

难度:β

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

标签:坐标系   chap   https   退出   自己   master   href   ble   html   

原文地址:https://www.cnblogs.com/Alrond/p/8387641.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!