标签:
Description
Input
Output
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
题目链接:http://poj.org/problem?id=3020
******************************************
题意:一个n*m的方阵 一个雷达可覆盖两个*,一个*可与四周的一个*被覆盖,一个*可被多个雷达覆盖问至少需要多少雷达能把所有的*覆盖
方法:把没个*变成数字,查看这些数字可与那些数字相连,然后用二分匹配,把能连得点匹配成对
AC代码:
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 #include<math.h> 6 #include<queue> 7 #include<stdlib.h> 8 9 using namespace std; 10 #define N 1010 11 #define INF 0x3f3f3f3f 12 13 int dis[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; 14 int vis[N],d[N],a[N][N],G[N][N],cot; 15 char str[N][N]; 16 17 int Hungry(int s) 18 { 19 for(int i=1;i<=cot;i++) 20 { 21 if(!vis[i] && G[s][i]) 22 { 23 vis[i]=1; 24 if(!d[i] || Hungry(d[i])) 25 { 26 d[i]=s; 27 return 1; 28 } 29 } 30 } 31 return 0; 32 } 33 int main() 34 { 35 int T,n,m,e,f; 36 scanf("%d",&T); 37 38 while(T--) 39 { 40 cot=1; 41 memset(a,0,sizeof(a)); 42 memset(G,0,sizeof(G)); 43 scanf("%d %d",&n,&m); 44 45 for(int i=0;i<n;i++) 46 { 47 scanf("%s",str[i]); 48 for(int j=0;j<m;j++) 49 { 50 if(str[i][j]==‘*‘) 51 a[i][j]=cot++; 52 } 53 } 54 for(int i=0;i<n;i++) 55 { 56 for(int j=0;j<m;j++) 57 { 58 if(str[i][j]==‘*‘) 59 { 60 e=a[i][j]; 61 for(int k=0;k<4;k++) 62 { 63 int x=i+dis[k][0]; 64 int y=j+dis[k][1]; 65 if(x>=0&&x<n&&y>=0&&y<m&&str[x][y]==‘*‘) 66 { 67 f=a[x][y]; 68 G[e][f]=G[f][e]=1; 69 } 70 } 71 } 72 } 73 } 74 memset(d,0,sizeof(d)); 75 int ans=0; 76 77 for(int i=1;i<cot;i++) 78 { 79 memset(vis,0,sizeof(vis)); 80 if(Hungry(i)) 81 ans++; 82 } 83 printf("%d\n",cot-ans/2-1); 84 } 85 return 0; 86 }
标签:
原文地址:http://www.cnblogs.com/weiyuan/p/5800957.html