• 【NOIP2016提高A组模拟9.9】Brothers


    Description

     在遥远的西方有一个古老的王国,国王将他的王国分成了网格状,每一块称之为一个城市。在国王临死前,他将这些城市分给了自己的N个儿子(编号为0到N-1)。然而这N个王子的关系不是很好,0讨厌1,1讨厌2,2讨厌3……N-1讨厌0。
     在国王死后,这种不好的关系使得王子之间爆发了战争。战斗只会在相邻的两个城市之间爆发(共有一条边称之为相邻),并且只有当A讨厌B时,A才会对B发起战斗,结果必定是A获得这次战斗的胜利。当一方胜利后,他所进攻的城市就会变成进攻方的。许多战斗是同时发生的,我们称之为一场战役。当多场战役发生之后,剩下的王子将不再发生战争。
     例如,如果有3个王子,那么战斗过程如下所示:
    

    这里写图片描述

    Input

     第一行输入4个数,N,R,C,K。有N个王子,王国分为R*C的网格图。询问K场战役之后的城市归属图。
    

    下面R行,每行C个数字,表示一开始城市的归属。

    Output

     R行C列,表示K场战役之后的城市归属图。
    

    提解

     用一个F数组表示i会被谁吃。然后暴力更新每一个点,即可。
    

    代码

    var
      n,r,c,k:longint;
      a,b:array [0..101,0..101] of integer;
      tong,f:array [0..101] of integer;
    procedure init;
    var
      i,j:longint;
    begin
      fillchar(tong,sizeof(tong),0);
      readln(n,r,c,k);
      for i:=1 to r do
        for j:=1 to c do
          begin
            read(a[i,j]);
            a[i,j]:=a[i,j]+1;
            inc(tong[a[i,j]]);
          end;
    
      for i:=0 to c+1 do
        begin
          a[0,i]:=maxint div 3;
          a[r+1,i]:=maxint div 3;
        end;
      for i:=1 to r do
        begin
          a[i,0]:=maxint div 3;
          a[i,c+1]:=maxint div 3;
        end;
    
      for i:=2 to n do
        f[i]:=i-1;
      f[1]:=n;
    end;
    
    procedure main;
    var
      l,i,j,x:longint;
    begin
      for l:=1 to k do
        begin
          for i:=1 to r do
            for j:=1 to c do
              begin
                x:=a[i,j]; b[i,j]:=0;
                if a[i-1,j]=f[x] then b[i,j]:=a[i-1,j] else
                  if a[i,j-1]=f[x] then b[i,j]:=a[i,j-1] else
                    if a[i+1,j]=f[x] then b[i,j]:=a[i+1,j] else
                      if a[i,j+1]=f[x] then b[i,j]:=a[i,j+1];
                if b[i,j]<>0 then begin dec(tong[x]); inc(tong[b[i,j]]); end
                             else b[i,j]:=x;
              end;
          for i:=1 to n do
            if tong[i]=0 then
              begin
                j:=(i+1) mod n;
                if f[j]=0 then j:=(j+1) mod n;
                f[j]:=i;
                f[i]:=0;
              end;
          a:=b;
        end;
    end;
    
    procedure print;
    var
      i,j:longint;
    begin
      for i:=1 to r do
        begin
          for j:=1 to c do
            write(a[i,j]-1,' ');
          writeln;
        end;
    end;
    
    begin
      init;
      main;
      print;
    end.
    
  • 相关阅读:
    洛谷P3796 【模板】AC自动机(加强版)(AC自动机)
    洛谷P3203 [HNOI2010]弹飞绵羊(LCT,Splay)
    洛谷P1501 [国家集训队]Tree II(LCT,Splay)
    LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
    [BZOJ3172][TJOI2013]单词 AC自动机
    [BZOJ1968][AHOI2005]COMMON约数研究 数学
    [BZOJ1053][SDOI2005]反素数ant 数学
    [BZOJ1045][HAOI2008]糖果传递 数学
    [BZOJ2733][HNOI2012]永无乡 线段树合并
    [BZOJ1005][HNOI2008]明明的烦恼 数学+prufer序列+高精度
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319578.html
Copyright © 2020-2023  润新知