题意/Description:
面对OIBH组织的嚣张气焰, 柯南决定深入牛棚, 一探虚实.
他经过深思熟虑, 决定从OIBH组织大门进入...........
OIBH组织的大门有一个很神奇的锁.
锁是由M*N个格子组成, 其中某些格子凸起(灰色的格子). 每一次操作可以把某一行或某一列的格子给按下去.
如果柯南能在组织限定的次数内将所有格子都按下去, 那么他就能够进入总部. 但是OIBH组织不是吃素的, 他们的限定次数恰是最少次数.
请您帮助柯南计算出开给定的锁所需的最少次数.
读入/Input:
第一行 两个不超过100的正整数N, M表示矩阵的长和宽
以下N行 每行M个数 非0即1 1为凸起方格
输出/Output:
一个整数 所需最少次数
题解/solution:
修改读入,水水的匹配。
代码/Code:
var
n,m,num:longint;
v:array [0..10001] of boolean;
link:array [0..10001] of longint;
a:array [0..501,0..501] of boolean;
function max(o,p:longint):longint;
begin
if o>p then exit(o);
exit(p);
end;
function find(i:integer):boolean;
var
k,q:integer;
begin
find:=true;
for k:=1 to max(n,m) do
if a[i,k] and not v[k] then
begin
q:=link[k]; link[k]:=i; v[k]:=true;
if (q=0) or find(q) then exit;
link[k]:=q;
end;
find:=false;
end;
procedure main;
var
i:longint;
begin
num:=0;
fillchar(link,sizeof(link),0);
for i:=1 to n do
begin
fillchar(v,sizeof(v),false);
if find(i) then inc(num);
end;
end;
procedure init;
var
i,j:longint;
c:char;
begin
fillchar(a,sizeof(a),0);
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do
begin
read(c);
if c='1' then a[i,j]:=true;
end;
readln;
end;
end;
begin
init;
main;
writeln(num);
end.