POJ3020

#include <iostream>
#include <string.h>
#include <stdio.h>


using namespace std;


bool vis[500];
int link[500];
bool gra[500][500];
int map[500][500];
int Pnum;
int v1,v2;
int row,clo;
int t,ans;


int search[4][2] = { {0,1}, {0,-1}, {1,0}, {-1,0} };


bool dfs( int x )
{
    for( int y = 1; y <= v2; y++)
    {
        if(gra[x][y] && ! vis[y])
        {
            vis[y] = true;
            if( !link[y] || dfs(link[y]))
            {
                link[y] = x;
                return true;
            }


        }
    }


    return false;
}


void find()
{


    for( int i = 1; i<= v1; i++)
      {
        memset(vis,0,sizeof(vis));
         if(dfs(i))
          ans++;
      }
    return ;
}


int main()
{
    scanf("%d",&t);
    while(t--)
    {
        ans = Pnum  = 0;
        memset(link,0,sizeof(link));
        memset(gra,0,sizeof(gra));
        memset(map,0,sizeof(map));
        char s;


        scanf("%d %d",&row, &clo);


        for( int i = 1; i<= row; i++)
        {
            getchar();
            for( int j = 1; j<= clo; j++)
            {
                scanf("%c",&s);
                if(s == '*')
                map[i][j] = ++Pnum;
            }
        }


        v1 = v2 = Pnum;
        for( int x = 1; x<= row; x++)
        {
            for( int y = 1; y<=clo; y++)
            {
                for( int k = 0; k < 4; k++)
                {
                    int nearx = x + search[k][0];
                    int neary = y + search[k][1];


                    if( map[nearx][neary] > 0)
                        gra[map[x][y]] [map[nearx][neary]] = true;


                }
            }
        }




       find();
       printf("%d\n",Pnum - ans/2);
    }
    return 0;
}

你可能感兴趣的:(POJ3020)