题目描述
面对OIBH组织的嚣张气焰, 柯南决定深入牛棚, 一探虚实.
他经过深思熟虑, 决定从OIBH组织大门进入.
OIBH组织的大门有一个很神奇的锁.
锁是由M*N个格子组成, 其中某些格子凸起(灰色的格子). 每一次操作可以把某一行或某一列的格子给按下去.
如果柯南能在组织限定的次数内将所有格子都按下去, 那么他就能够进入总部. 但是OIBH组织不是吃素的, 他们的限定次数恰是最少次数.
请您帮助柯南计算出开给定的锁所需的最少次数.
分析
把行和边连边,做算法就行了,几乎和Asteroids一样
(做这题的时候突然发现Asteroids我做的是错的,然后看了一下题库居然还AC了。。。)
#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
int n,m,ans;
int f[101],x[101],y[101],q[101],p[101];
bool map[101][101],r[101];
int i,j;
char c;
bool fin(int a)
{
int i,d;
for (i=1;i<=m;i++)
if (map[a][i]&&!r[i])
{
d=f[i];f[i]=a;r[i]=1;
if (d==0||fin(d)) return true;
f[i]=d;
}
return false;
}
int main()
{
scanf("%d%d\n",&n,&m);
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
scanf("%c",&c);
if (c=='1')
map[i][j]=1;
}
scanf("%c",&c);
}
for (i=1;i<=n;i++)
{
memset(r,0,sizeof(r));
if (fin(i)) ans++;
}
printf("%d\n",ans);
}