zoukankan      html  css  js  c++  java
  • poj 3020

    题意:给定一个m*n的矩阵  包括*与O  现在需要用矩形把*覆盖住 问 至少需要多少个矩形 每个矩形可以覆盖两个*

    思路:匈牙利算法

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 int map[444][444];
     5 int fa[444];
     6 int s[444];
     7 int sum;
     8 int v[55][55];
     9 int dir[4][2]={-1,0,1,0,0,-1,0,1};
    10 bool dfs(int u)
    11 {
    12     int i;
    13     for(i=1;i<=sum;i++)
    14         if(map[u][i]&&!s[i])
    15         {
    16             s[i]=1;
    17             if(!fa[i]||dfs(fa[i]))
    18             {
    19                 fa[i]=u;
    20                 return true;
    21             }
    22         }
    23     return false;
    24 }
    25 int main()
    26 {
    27     int t,m,n,i,j,xx,yy;
    28     char c;
    29     scanf("%d",&t);
    30     while(t--)
    31     {
    32         sum=0;
    33         scanf("%d%d",&m,&n);
    34         memset(map,0,sizeof(map));
    35         memset(fa,0,sizeof(fa));
    36         for(i=0;i<m;i++)
    37             for(j=0;j<n;j++)
    38             {
    39                 cin>>c;
    40                 if(c=='*')
    41                 {
    42                     sum++;
    43                     v[i][j]=sum;
    44                 }
    45                 else v[i][j]=0;
    46             }
    47             for(i=0;i<m;i++)
    48                 for(j=0;j<n;j++)
    49                     if(v[i][j]>0)
    50                     {
    51                         for(int k=0;k<4;k++)
    52                         {
    53                             xx=i+dir[k][0];yy=j+dir[k][1];
    54                             if(xx<0||xx>=m||yy<0||yy>=n)
    55                                 continue;
    56                             if(v[xx][yy]>0)
    57                             {
    58                                 map[v[xx][yy]][v[i][j]]=1;
    59                                 map[v[i][j]][v[xx][yy]]=1;
    60                             }
    61                         }
    62                     }
    63             int nsum=0;
    64             for(i=1;i<=sum;i++)
    65             {
    66                 memset(s,0,sizeof(s));
    67                 if(dfs(i))
    68                     nsum++;
    69             }
    70             cout<<sum-nsum+nsum/2<<endl;
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    2-5
    2-3
    2-2
    2-1
    1-1
    实验6-1 求数组及其下标
    实验4-2 关于求阶乘的运算
    作业 3-5 switch语句的应用
    作业3-6 查询水果单价
    作业3-4 判断是不是闰年
  • 原文地址:https://www.cnblogs.com/zhangdashuai/p/3780612.html
Copyright © 2011-2022 走看看