zoukankan      html  css  js  c++  java
  • 九宫格数值分组

    解答网友问题, 记录如下:

    原始数据

    11,38
    11,36
    11,37
    11,39
    11,40
    12,34
    12,35
    12,36
    12,37
    12,38
    12,40
    13,33
    13,34
    13,35
    13,36
    13,40
    14,32
    14,33
    14,34
    14,35
    14,40
    15,31
    15,32
    15,33
    15,34
    15,40
    16,30
    16,31
    16,32
    16,39
    17,29
    1,1
    2,0
    2,1
    2,3
    2,4
    3,1


    处理代码

    unit Unit15;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, rtlconsts;
    
    type
      TForm15 = class(TForm)
        btn1: TButton;
        mmo1: TMemo;
        procedure btn1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    
    var
      Form15: TForm15;
    
    implementation
    
    type
      TCustomGroup = class
      private
        type
        TRes = record
          X, Y, Sum : integer;
        end;
        PRes = ^TRes;
      private
        FArr : array of TRes;
    
        FFileName : string;
        FCount : integer;
    
        procedure Fill;
        procedure FillRes(const Value : string; ARes : PRes);
        procedure Sort;
        procedure Output(ALst : TStrings);
      public
        constructor Create(const AFileName : string);
        function Exec(ALst : TStrings) : Boolean;
      end;
    {$R *.dfm}
    
    procedure TForm15.btn1Click(Sender: TObject);
    begin
      mmo1.Clear;
    
      with TCustomGroup.Create('c:	est.txt') do
      try
        if Exec(mmo1.Lines) then
        begin
          mmo1.SelStart := 0;
          mmo1.SelLength := 0;
    
          ShowMessage('Ok')
        end
        else
          ShowMessage('Error');
      finally
        Free;
      end;
    end;
    
    { TCustomGroup }
    
    constructor TCustomGroup.Create(const AFileName: string);
    begin
      FFileName := AFileName;
    end;
    
    function TCustomGroup.Exec(ALst: TStrings): Boolean;
    begin
      Result := false;
      try
        Fill;
        Sort;
        Output(ALst);
    
        Result := True;
      except on E: Exception do
        Result := false;
      end;
    end;
    
    procedure TCustomGroup.Fill;
    var
      i: Integer;
      sLst : TStringList;
    begin
      sLst := TStringList.Create;
      try
        sLst.LoadFromFile(FFileName);
    
        if sLst.Count < 2 then
          Exit;
    
        FCount := sLst.Count;
        SetLength(FArr, FCount);
    
        for i := 0 to sLst.Count - 1 do
        begin
          FillRes(sLst.Strings[i], @FArr[i]);
        end;
      finally
        slst.Free;
      end;
    end;
    
    procedure TCustomGroup.FillRes(const Value: string; ARes: PRes);
    var
      idx : integer;
    begin
      idx := Pos(',', value);
      ARes.X := StrToInt(Copy(Value, 1, idx - 1));
      ARes.Y := StrToInt(Copy(Value, idx + 1, Length(Value)));
      ARes.Sum := ARes.X + ARes.Y;
    end;
    
    procedure TCustomGroup.Output(ALst : TStrings);
    var
      vRes : TRes;
    
      procedure Extract(const idx: integer);
      begin
        if (idx < 0) or (idx >= FCount) then
          raise EArgumentOutOfRangeException.CreateRes(@SArgumentOutOfRange);
    
        ALst.Add(Format('%d,%d', [FArr[Idx].X, FArr[Idx].Y]));
        Dec(FCount);
    
        if Idx <> FCount then
        begin
          vRes := FArr[Idx];
          Move(FArr[Idx + 1], FArr[Idx], (FCount - Idx) * SizeOf(TRes));
          FillChar(FArr[FCount], SizeOf(TRes), 0);
        end;
      end;
    var
      idx, X, Y : integer;
    begin
      repeat
        idx := Low(FArr);
        vRes := FArr[idx];
    
        while FCount > idx do
        begin
          X := Abs(FArr[idx].x - vRes.x);
          Y := Abs(FArr[idx].y - vRes.y);
    
          if (X in [0, 1]) and (Y in [0, 1]) then
          begin
            Extract(idx);
          end
          else
          begin
            inc(idx);
          end
        end;
        ALst.Add('');
      until FCount = 0;
    end;
    
    procedure TCustomGroup.Sort;
    var
      i, j : integer;
      vRes : TRes;
    begin
      for i := low(FArr) to High(FArr) - 1 do
      begin
        for j := i + 1 to High(FArr) do
        begin
          if FArr[i].X > FArr[j].X then
          begin
            vRes := FArr[i];
            FArr[i] := FArr[j];
            FArr[j] := vRes;
          end
          else
          if (FArr[i].X = FArr[j].X) and (FArr[i].Y > FArr[j].Y) then
          begin
            vRes := FArr[i];
            FArr[i] := FArr[j];
            FArr[j] := vRes;
          end;
        end;
      end;
    end;
    
    end.
    


    处理结果

    1,1
    2,0
    2,1
    3,1
    
    2,3
    2,4
    
    11,36
    11,37
    11,38
    11,39
    11,40
    12,40
    13,40
    14,40
    15,40
    16,39
    
    12,34
    12,35
    12,36
    12,37
    12,38
    
    13,33
    13,34
    13,35
    13,36
    14,35
    15,34
    
    14,32
    14,33
    14,34
    15,33
    16,32
    
    15,31
    15,32
    16,31
    
    16,30
    17,29


  • 相关阅读:
    为什么未来是全栈project师的世界?
    剑指Offer面试题10(Java版):二进制中的1的个数
    arm-linux内存管理学习笔记(1)-内存页表的硬件原理
    高速掌握Lua 5.3 —— 字符串库 (2)
    C语言实现使用动态数组来构造栈结构
    [自学AndroidStudio系列]第二篇章:高速上手AS小技巧其一
    苹果新的编程语言 Swift 语言进阶(十三)--类型检查与类型嵌套
    JAVA 安装JDK注意事项
    hdu 1398 Square Coins(母函数)
    百度有道雅虎的实习面试经历
  • 原文地址:https://www.cnblogs.com/riskyer/p/3241333.html
Copyright © 2011-2022 走看看