操,我自己玩还不一定每次都能玩出来。

解决方案 »

  1.   

    很简单啊 2维的 换成1维 排序 重新换成2维
      

  2.   

    以前回答过了,不过那个人要求用delphi写,我就用delphi写,你改成c#好了不过有点小区别,这个是把
    145
    627
    893 一步步变成
    123
    456
    789而已[code=Delphi(Pascal)]
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormShow(Sender: TObject);
    var
      i:Integer;
      A:array[0..2,0..2] of Integer;  function SwapInteger(i1,j1,i2,j2:Integer):Boolean;
      var
        T:Integer;
        Value:Integer;
      begin
        Value:=A[i2,j2]-1;
        if (Value<A[i1,j1]-1) and (Value div 3=i2) and (Value mod 3=j2) then
        begin
          // 比当前小的而且是已经排好位置的值不允许换
          Result:=false;
          Exit;
        end;
        T:=A[i1,j1];
        A[i1,j1]:=A[i2,j2];
        A[i2,j2]:=T;
        Result:=true;
      end;  procedure Print;
      var
        i,j:Integer;
        S:String;
      begin
        for i:=0 to 2 do
        begin
          S:='';
          for j:=0 to 2 do
            S:=S+IntToStr(A[i,j])+' ';
          Memo1.Lines.Add(S);
        end;
        Memo1.Lines.Add('--------');
      end;  procedure Change(TestValue:Integer);
      var
        i,j:Integer;
        Changed:Boolean;
        Value:Integer;
      label
        NEXT;
      begin
        Value:=TestValue-1;
        while true do
        begin
          NEXT:
          Changed:=false;
          for i:=0 to 2 do
            for j:=0 to 2 do
              if A[i,j]=TestValue then
              begin
                if (i<Value div 3) and (i<2) then
                begin
                  // 右移
                  Changed:=SwapInteger(i,j,i+1,j);
                  if Changed then
                    Print;
                end;
                if (i>Value div 3) and (i>0) then
                begin
                  // 左移
                  Changed:=SwapInteger(i,j,i-1,j);
                  if Changed then
                    Print;
                end;
                if (j<Value mod 3) and (j<2) then
                begin
                  // 上移
                  Changed:=SwapInteger(i,j,i,j+1);
                  if Changed then
                    Print;
                end;
                if (j>Value mod 3) and (j>0) then
                begin
                  // 下移
                  Changed:=SwapInteger(i,j,i,j-1);
                  if Changed then
                    Print;
                end;
                if not Changed then
                  Exit
                else
                  goto NEXT;
              end;
          end;
        end;begin
      A[0,0]:=7;
      A[0,1]:=3;
      A[0,2]:=5;
      A[1,0]:=1;
      A[1,1]:=6;
      A[1,2]:=8;
      A[2,0]:=2;
      A[2,1]:=4;
      A[2,2]:=9;  Memo1.ScrollBars:=ssBoth;
      Memo1.Clear;
      Print;  for i:=1 to 9 do
        Change(i);
    end;
    end./code]