题目描述
给出一个N*N的网格,用'.'表示空地,用'X'表示墙。在网格上放碉堡,可以控制所在的行和列,但不能穿过墙。
问:最多能放多少个碉堡?
二分图匹配解法:将横向的联通块作为x部,纵向作为y部(如果只有一个格子就被堵死也算一个联通块)。如有相交则连边。每一条边实际对应了一个碉堡,如果有两条边指向同一个点,实际表示两个碉堡放在了同一个联通块,会产生冲突。所以求最大匹配数就对应了最大可能放的碉堡数。
这是我两年前写的辣鸡代码。丑的要死。。
#include<cstdio>
#include<list>
#include<cstring>
using namespace std;
int n, ans;
char map[10][10];
int xsum,ysum;
int x[10][10];
int y[10][10];
int nx[400][3], ny[400][3];
list<int> myl[1000];
bool vis[1000];
int c[1000];
void init()
{
int i, j, k;
for (i=1; i<=n; ++i