问题描述
有一个
N*M(N,M<=50)
的棋盘,棋盘的每一格是三种类型之
一:空地、草地、墙。机器人只能放在空地上。在同一行或同一
列的两个机器人,若它们之间没有墙,则它们可以互相攻击。问
给定的棋盘,最多可以放置多少个机器人,使它们不能互相攻
击。
var
map:array[0..101,0..101] of boolean;sl:string;
ch:char;
link:array[0..101] of longint;
a,b:array[1..101,1..101]of longint;
cover:array[0..101] of boolean;
kk,i,j,n,m,s,ans,x,y,n1,m1,i1,j1:longint;
function find(i:longint):boolean;
var
k,q:longint;
begin
find:=true;
for k:=1 to n do
if map[i,k] and not(cover[k])
then begin
q:=link[k];
link[k]:=i;
cover[k]:=true;
if (q=0) or find(q) then exit;
link[k]:=q;
end;
find:=false;
end;
procedure main;
var
i:longint;
begin
for i:=1 to n do
begin
fillchar(cover,sizeof(cover),0);
find(i);
end;
end;
begin
readln(n,m);
for i:=1 to n do
for j:=1 to m do
begin
read(a[i,j]);
if a[i,j]=1 then inc(n1);
b[n1,1]:=i;
b[n1,2]:=j;
end;
for i:=1 to n1 do
begin
i1:=b[i,1];
j1:=b[i,2];
for j:=1 to m do
if a[i1,j]<>3 then
begin
if a[i1,j]=1 then map[i1,j]:=true;
end
else break;
for j:=1 to n do
begin
if a[j,j1]<>3 then
begin
if a[j,j1]=1 then map[j,j1]:=true;
end
else break;
end;
end;
for i:=1 to n do
if link[i]<>0 then inc(ans);
writeln(ans);
end.