博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3020, Antenna Placement
阅读量:6951 次
发布时间:2019-06-27

本文共 3846 字,大约阅读时间需要 12 分钟。

Time Limit: 1000MS  Memory Limit: 65536K

Total Submissions: 2236  Accepted: 1038

Description
The Global Aerial Research Centre has been allotted the task of building the fifth generation of mobile phone nets in Sweden. The most striking reason why they got the job, is their discovery of a new, highly noise resistant, antenna. It is called 4DAir, and comes in four types. Each type can only transmit and receive signals in a direction aligned with a (slightly skewed) latitudinal and longitudinal grid, because of the interacting electromagnetic field of the earth. The four types correspond to antennas operating in the directions north, west, south, and east, respectively. Below is an example picture of places of interest, depicted by twelve small rings, and nine 4DAir antennas depicted by ellipses covering them. 
 
Obviously, it is desirable to use as few antennas as possible, but still provide coverage for each place of interest. We model the problem as follows: Let A be a rectangular matrix describing the surface of Sweden, where an entry of A either is a point of interest, which must be covered by at least one antenna, or empty space. Antennas can only be positioned at an entry in A. When an antenna is placed at row r and column c, this entry is considered covered, but also one of the neighbouring entries (c+1,r),(c,r+1),(c-1,r), or (c,r-1), is covered depending on the type chosen for this particular antenna. What is the least number of antennas for which there exists a placement in A such that all points of interest are covered?

Input
On the first row of input is a single positive integer n, specifying the number of scenarios that follow. Each scenario begins with a row containing two positive integers h and w, with 1 <= h <= 40 and 0 < w <= 10. Thereafter is a matrix presented, describing the points of interest in Sweden in the form of h lines, each containing w characters from the set ['*','o']. A '*'-character symbolises a point of interest, whereas a 'o'-character represents open space.

Output
For each scenario, output the minimum number of antennas necessary to cover all '*'-entries in the scenario's matrix, on a row of its own.

 

Sample Input

2
7 9
ooo**oooo
**oo*ooo*
o*oo**o**
ooooooooo
*******oo
o*o*oo*oo
*******oo
10 1
*
*
*
o
*
*
*
*
*
*

 

Sample Output

17
5

 

Source

Svenskt Mästerskap i Programmering/Norgesmesterskapet 2001


//
 POJ3020.cpp : Defines the entry point for the console application.
//
#include 
<
iostream
>
#include 
<
map
>
using
 
namespace
 std;
bool
 DFS(
int
 k, 
bool
 d[
451
][
451
], 
bool
 visited[
451
], 
int
 match[
451
], 
int
 n)
{
    
for
 (
int
 j 
=
 
0
; j 
<
 n; 
++
j)
        
if
 (visited[j]
==
false
 
&&
 d[k][j] 
==
 
true
)
        {
            visited[j] 
=
 
true
;
            
if
 (match[j] 
==
 
-
1
 
||
 DFS(match[j],d,visited,match,n))
            {
                match[j] 
=
 k;
                
return
 
true
;
            }
        };
    
return
 
false
;
}
int
 main(
int
 argc, 
char
*
 argv[])
{
    
int
 cases;
    cin 
>>
 cases;
    
int
 h, w;
    
char
 map[
41
][
11
];
    
int
 im[
41
][
11
];
    
bool
 d[
451
][
451
];
    
int
 walk[
4
][
2
]
=
{
-
1
0
0
1
1
0
0
-
1
};
    
bool
 visited[
451
];
    
int
 match[
451
];
    
for
 (
int
 c 
=
 
0
; c 
<
 cases; 
++
c)
    {
        scanf(
"
%d %d\n
"
,
&
h, 
&
w);
        
for
 (
int
 i 
=
 
0
; i 
<
 h; 
++
i)gets(map[i]);
        
int
 cnt 
=
 
0
;
        
for
 (
int
 i 
=
 
0
; i 
<
 h; 
++
i)
            
for
 (
int
 j 
=
 
0
; j 
<
 w; 
++
j)
                im[i][j] 
=
 map[i][j] 
==
 
'
*
'
 
?
 cnt
++
:
-
1
;
        memset(d, 
0
sizeof
(d));
        
for
 (
int
 i 
=
 
0
; i 
<
 h; 
++
i)
            
for
 (
int
 j 
=
 
0
; j 
<
 w; 
++
j)
                
if
 (im[i][j] 
!=
 
-
1
)
                    
for
(
int
 k 
=
 
0
; k 
<
 
4
++
k)
                    {
                        
int
 y 
=
 i 
+
 walk[k][
0
];
                        
int
 x 
=
 j 
+
 walk[k][
1
];
                        
if
 (x 
>=
 
0
 
&&
 x 
<
 w 
&&
 y 
>=
 
0
 
&&
 y 
<
 h 
&&
 im[y][x] 
!=
 
-
1
) d[im[i][j]][im[y][x]] 
=
 
true
;
                    };
        
int
 result 
=
 
0
;
        memset(match, 
-
1
sizeof
(match));
        
for
 (
int
 i 
=
 
0
; i 
<
 cnt; 
++
i)
        {
            memset(visited, 
0
sizeof
(visited));
            
if
 (DFS(i,d,visited,match,cnt)) 
++
 result;
        }
        cout 
<<
 cnt 
-
 (result 
>>
 
1
<<
 endl;
    }
    
return
 
0
;
}

转载于:https://www.cnblogs.com/asuran/archive/2009/10/07/1578674.html

你可能感兴趣的文章
mongodb嵌套文档结构设计
查看>>
[Sqoop]Sqoop使用
查看>>
Maven学习笔记(一)
查看>>
《零基础 Java 开发 》 第三章 运算符
查看>>
Maven_学习_01_跳过单元测试
查看>>
推荐 :2018最流行的编程语言Top 3
查看>>
BeanFactory 和 ApplicationContext
查看>>
Java如何制作帮助文档(API)
查看>>
Parrot 4.6 发布,基于 Debian 的 Linux 发行版
查看>>
HTML 基础
查看>>
NSA 将向公众开源逆向工程工具 GHIDRA
查看>>
微博内容正则表达式匹配链接, 话题标签与@用户
查看>>
ES6 - class的学习
查看>>
Maven和Gradle如何添加依赖
查看>>
Android RuntimePermissions运行时权限:批量权限申请
查看>>
LoRaWAN技术在物联网应用领域的优势
查看>>
“突破聆听”计划:霍金联手扎克伯格,斥巨资探索外星生命
查看>>
Android加载Gif和ImageView的通用解决方案:android-gif-drawable:GifTextView(2)
查看>>
web3j 以太坊客户端 Infura 签名
查看>>
为警察服务,微软将提供云端快速访问解决方案
查看>>