CoVH之柯南开锁

题意/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.
原文地址:https://www.cnblogs.com/zyx-crying/p/9319676.html