I and OI
Past...

题意:一个3*3的矩形可以用若干个2*2的矩形去覆盖,现在给出一个最终的图,求它是否合法.

分析:就是拓扑排序.

code:

const yes='THESE WINDOWS ARE CLEAN';
      no='THESE WINDOWS ARE BROKEN';

var   sta:array[1..9,0..1] of longint=((1,1),(1,2),(1,3),
                                       (2,1),(2,2),(2,3),
                                       (3,1),(3,2),(3,3));
      map:array[0..10,0..10] of longint;
      link:array[0..10,0..10] of boolean;
      incount:array[0..10] of longint;
      vis:array[0..10] of boolean;
      o,i,j,t,now:longint;
      st,en:string;
      flag,found:boolean;

      function check:boolean;
      var   oo:longint;
      begin
            for oo:=1 to 9 do
               if incount[oo]<>0 then exit(false);
            exit(true);
      end;


begin
      readln(st);
      while st<>'ENDOFINPUT' do
      begin
            fillchar(map,sizeof(map),0);
            fillchar(vis,sizeof(vis),0);
            fillchar(link,sizeof(link),0);
            fillchar(incount,sizeof(incount),0);

            for i:=1 to 4 do
            begin
                  for j:=1 to 4 do read(map[i,j]);
                  readln;
            end;
            readln(en);

            for o:=1 to 9 do
               for i:=sta[o,0] to sta[o,0]+1 do
                  for j:=sta[o,1] to sta[o,1]+1 do
                  if (map[i,j]<>o)and(not link[map[i,j],o]) then
                  begin
                        inc(incount[o]);
                        link[map[i,j],o]:=true;
                  end;

            flag:=true;
            for t:=1 to 9 do
            begin
                  found:=false;
                  for i:=1 to 9 do
                     if (incount[i]=0)and(not vis[i]) then
                     begin
                           now:=i;
                           found:=true;
                           vis[i]:=true;
                           break;
                     end;
                  if (found=false)and(not check) then
                  begin flag:=false; break; end;

                  for i:=1 to 9 do
                     if link[now,i] then
                     begin
                           dec(incount[i]);
                           link[now,i]:=false;
                     end;
            end;

            if not flag then writeln(no)
            else writeln(yes);
            readln(st);
      end;
end.
posted on 2011-08-13 13:38  exponent  阅读(315)  评论(0编辑  收藏  举报