Place the Robots(ZOJ1654)

问题描述
      有一个 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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值