题目名称 | 1530. [UVa 1501] 修建长城 |
---|---|
输入输出 | constructthegreatwall.in/out |
难度等级 | ★★★★ |
时间限制 | 1000 ms (1 s) |
内存限制 | 256 MiB |
测试数据 | 10 |
题目来源 | cstdio 于2014-02-23加入 |
开放分组 | 全部用户 |
提交状态 | |
分类标签 | |
分享题解 |
通过:2, 提交:2, 通过率:100% | ||||
cstdio | 100 | 0.125 s | 0.41 MiB | C++ |
cstdio | 100 | 0.321 s | 7.18 MiB | C++ |
关于 修建长城 的近10条评论(全部评论) | ||||
---|---|---|---|---|
需要仔细考虑转移……
达成成就:《训练指南》轮廓线DP……真淡腾…… |
constructthegreatwall.in
输出文件:constructthegreatwall.out
简单对比防御墙是一种保护城市或定居点免遭潜在侵略者袭击的工事。从古至今,人们都在定居点周围修建这些墙。
通常,它们被称为城墙。虽然这样,我们的祖先决定修建长城来保护中原免遭各种游牧部落的入侵。
地图是一个给定的N*M矩形区域。每一个格子是一块空地,一座城市或者一支敌军。长城是一个边沿着格线的简单多边形,围住了所有的城市,将所有的敌军挡在外面。
长城并不容易建造,因此我们必须让长城尽可能短。现在你的任务是计算围住所有城市但不围住任意一支敌军的长城的最短长度。
输入文件的第一行是一个整数T(1<=T<=50),代表数据组数。
每组数据有若干行。
数据的第一行有两个正整数H,W(1<=H,W<=8),代表地图的行数和列数。
接下来H行每行有W个字符,代表相应的格子。'o'代表城市,'.'代表空地,'x'代表敌军。
保证至少有一座城市。
对每组数据,输出一行"Case #X: Y",其中X是数据编号(从1开始),Y是长城的最短长度(如果无法建造,输出-1)。
3
3 3
.o.
.x.
o.o
4 4
....
.ox.
.xo.
....
5 5
.ooo.
.x...
..xoo
x.xoo
.ox.x
Case #1: 14
Case #2: -1
Case #3: 28
一个简单多边形是平面上一系列线段围成的封闭区域,这些线段之间除了相邻边之外没有公共点。
样例的第一组数据的解见图1.
样例的第二组数据没有解,因为无论如何修建长城,它的非相邻边总会相交。