我自己刚刚写的,有点麻烦的说using System;
using System.Collections.Generic;
using System.Text;namespace ConsoleApplication2Sort
{
    class Program
    {
        static void Main(string[] args)
        {
            int[,] A=new int [3,3];            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;            Console.WriteLine("原始数据");
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    Console.Write(A[i,j]+" ");
                }
                Console.WriteLine();
            }            Console.WriteLine();            int num = 1;
            for (num = 1; num < 10; num++)
            {
                int x1 = 0;
                int y1 = 0;                //根据数字得到坐标
                if (num >= 1 && num <= 3)
                {
                    x1 = 0;
                    y1 = num - 1;
                }
                else if (num >= 4 && num <= 6)
                {
                    x1 = 1;
                    y1 = num - 4;
                }
                else
                {
                    x1 = 2;
                    y1 = num - 7;
                }
                int x = 0;
                int y = 0;                //得到1号的位置
                for (int i = 0; i < 3; i++)
                {
                    for (int j = 0; j < 3; j++)
                    {
                        if (A[i, j] == num)
                        {
                            x = i;
                            y = j;
                        }
                    }
                }
                //左右交换
                while (y != y1)
                {
                    if (y > y1)
                    {
                        int temp = A[x, y];
                        A[x, y] = A[x, y - 1];
                        A[x, y - 1] = temp;
                        y = y - 1;
                        show(A);
                        Console.WriteLine("向左交换"+num+"\n");
                    }
                    else if (y < y1)
                    {
                        int temp = A[x, y];
                        A[x, y] = A[x, y + 1];
                        A[x, y + 1] = temp;
                        y = y + 1;
                        show(A);
                        Console.WriteLine("向右交换" + num + "\n");
                    }
                    else
                    {
                        break;
                    }
                }                //上下交换
                while (x != x1)
                {
                    if (x > x1)
                    {
                        int temp = A[x, y];
                        A[x, y] = A[x - 1, y];
                        A[x - 1, y] = temp;
                        x = x - 1;
                        show(A);
                        Console.WriteLine("向上交换" + num + "\n");                       
                    }
                    else if (y < y1)//其实永远不会有向下交换的
                    {
                        int temp = A[x, y];
                        A[x, y] = A[x + 1, y];
                        A[x + 1, y] = temp;
                        x = x + 1;
                        show(A);
                        Console.WriteLine("向下交换" + num + "\n");                       
                    }
                } 
            }            //看看最后的结果
            Console.WriteLine("最后的结果。");
            show(A);
            Console.Read();
        }        public static void show(int[,] A)
        {
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    Console.Write(A[i, j] + " ");
                }
                Console.WriteLine();
            }
        }
    }
}运行结果:原始数据
7 3 5
1 6 8
2 4 91 3 5
7 6 8
2 4 9
向上交换11 3 5
7 6 8
4 2 9
向右交换21 3 5
7 2 8
4 6 9
向上交换21 2 5
7 3 8
4 6 9
向上交换21 2 5
7 8 3
4 6 9
向右交换31 2 3
7 8 5
4 6 9
向上交换31 2 3
4 8 5
7 6 9
向上交换41 2 3
4 5 8
7 6 9
向左交换51 2 3
4 5 8
7 9 6
向右交换61 2 3
4 5 6
7 9 8
向上交换61 2 3
4 5 6
7 8 9
向左交换8最后的结果。
1 2 3
4 5 6
7 8 9

解决方案 »

  1.   

    向下交换的写错了是:
    else if (x < x1)//其实永远不会有向下交换的
      

  2.   

    int[] one ={maze[0,1],maze[1,0]};
    int[] two ={maze[2,2],maze[1,1],maze[0,2]};
    int[] three{maze[2,1],maze[1,2]}对one排序 ,排序后坐标 分别为 0,1  0,2对two排序 排序后坐标分别为 1,0  1,1  1,2最three排序 排序后分别为 2,0 2,1之后再对每个点先左后右移动,直到到达预定坐标.
      

  3.   

    谢谢,能不能给出具体程序,最好用DELPHI编写的
      

  4.   

    我找不到最优方法,就找了个肯定正确的方法
    procedure Tform1.swap(x,y:integer;sender:Tobject);
    var
     tmp,i,j,m,n:integer;
    begin
      case x of
        1:
        begin
        i:=1;j:=1
        end;
        2:
        begin
        i:=1;j:=2
        end;
        3:
        begin
        i:=1;j:=3
        end;
        4:
        begin
        i:=2;j:=1
        end;
        5:
        begin
        i:=2;j:=2
        end;
        6:
        begin
        i:=2;j:=3
        end;
        7:
        begin
        i:=3;j:=1
        end;
        8:
        begin
        i:=3;j:=2
        end;
        9:
        begin
        i:=3;j:=3
        end;
      end;
      case y of  
        1:       
        begin
        m:=1;n:=1
        end;     
        2:       
        begin
        m:=1;n:=2
        end;     
        3:       
        begin
        m:=1;n:=3
        end;     
        4:       
        begin
        m:=2;n:=1
        end;     
        5:
        begin
        m:=2;n:=2
        end;     
        6:       
        begin
        m:=2;n:=3
        end;     
        7:       
        begin
        m:=3;n:=1
        end;     
        8:       
        begin
        m:=3;n:=2
        end;     
        9:       
        begin
        m:=3;n:=3
        end;
      end;
      tmp:=source[i,j];
      source[i,j]:=source[m,n];
      source[m,n]:=tmp;
      memo2.Lines.Add(inttostr(x)+inttostr(y));
      //print(sender);
    end;
    //对1进行排序------------------------------------------------------------------//
      //memo2.Lines.Add('对1排序开始-----------');
      for i:=1 to 3 do
        begin
        for j:=1 to 3 do
        begin
          if (source[i,j]=1) and (source[i,j]<>dest[i,j]) then
          begin
            //memo2.Lines.Add(inttostr(i)+' '+inttostr(j));
        //确定X轴-------------------//
            for x:=i downto 2 do
            begin
              tmp:=source[x,j];
              source[x,j]:=source[x-1,j];
              source[x-1,j]:=tmp;
              //memo2.Lines.Add(inttostr(x)+inttostr(x-1));
              memo2.Lines.Add(inttostr(dest[x,j])+inttostr(dest[x-1,j]));
              //Print(Sender);
            end;
        //确定X轴-------------------//    //确定Y轴-------------------//
            for y:=j downto 2 do
            begin
              tmp:=source[1,y];
              source[1,y]:=source[1,y-1];
              source[1,y-1]:=tmp;
              //memo2.Ljnes.Add(jnttostr(y)+jnttostr(y-1));
              memo2.Lines.Add(inttostr(dest[1,y])+inttostr(dest[1,y-1]));
              //Print(Sender);
            end;
        //确定Y轴-------------------//
          end;
        end;
      end;
      //memo2.Lines.Add('对1排序完毕,结果为:');
      //Print(Sender);
      //memo2.Lines.Add('对1排序完毕-----------------------');
    //对1进行排序------------------------------------------------------------------////对2进行排序------------------------------------------------------------------//
      //memo2.Lines.Add('对2排序开始-----------');
      for i:=1 to 3 do
        begin
        for j:=1 to 3 do
        begin
          if (source[i,j]=2) and (source[i,j]<>dest[i,j]) then
          begin
            case dest[i,j] of
              3:
              begin
              swap(3,2,sender);
              end;
              4:
              begin
              swap(4,5,sender);
              swap(5,2,sender);
              end;
              5:
              begin
              swap(5,2,sender);
              end;
              6:
              begin
              swap(6,5,sender);
              swap(5,2,sender);
              end;
              7:
              begin
              swap(7,8,sender);
              swap(8,5,sender);
              swap(5,2,sender);
              end;
              8:
              begin
              swap(8,5,sender);
              swap(5,2,sender);
              end;
              9:
              begin
              swap(9,8,sender);
              swap(8,5,sender);
              swap(5,2,sender);
              end;
            end;
          end;
        end;
      end;
      //memo2.Lines.Add('对2排序完毕,结果为:');
      //Print(Sender);
      //memo2.Lines.Add('对2排序完毕-----------------------');
    //对2进行排序------------------------------------------------------------------////对3进行排序------------------------------------------------------------------//
      //memo2.Lines.Add('对3排序开始-----------');
      for i:=1 to 3 do
        begin
        for j:=1 to 3 do
        begin
          if (source[i,j]=3) and (source[i,j]<>dest[i,j]) then
          begin
            case dest[i,j] of
              4:
              begin
              swap(4,5,sender);
              swap(5,6,sender);
              swap(6,3,sender);
              end;
              5:
              begin
              swap(5,6,sender);
              swap(6,3,sender);
              end;
              6:
              begin
              swap(6,3,sender);
              end;
              7:
              begin
              swap(7,8,sender);
              swap(8,9,sender);
              swap(9,6,sender);
              swap(6,3,sender);
              end;
              8:
              begin
              swap(8,9,sender);
              swap(9,6,sender);
              swap(6,3,sender);
              end;
              9:
              begin
              swap(9,6,sender);
              swap(6,3,sender);
              end;
            end;
          end;
        end;
      end;
      //memo2.Lines.Add('对3排序完毕,结果为:');
      //Print(Sender);
      //memo2.Lines.Add('对3排序完毕-----------------------');
    //对3进行排序------------------------------------------------------------------//
    //对4进行排序------------------------------------------------------------------//
      //memo2.Lines.Add('对4排序开始-----------');
      for i:=2 to 3 do
        begin
        for j:=1 to 3 do
        begin
          if (source[i,j]=4) and (source[i,j]<>dest[i,j]) then
          begin
            case dest[i,j] of
              5:
              begin
              swap(5,4,sender);
              end;
              6:
              begin
              swap(6,5,sender);
              swap(5,4,sender);
              end;
              7:
              begin
              swap(7,4,sender);
              end;
              8:
              begin
              swap(8,7,sender);
              swap(7,4,sender);
              end;
              9:
              begin
              swap(9,8,sender);
              swap(8,7,sender);
              swap(7,4,sender);
              end;
            end;
          end;
        end;
      end;
      //memo2.Lines.Add('对4排序完毕,结果为:');
      //Print(Sender);
      //memo2.Lines.Add('对4排序完毕-----------------------');
    //对4进行排序------------------------------------------------------------------////对5进行排序------------------------------------------------------------------//
      //memo2.Lines.Add('对5排序开始-----------');
      for i:=2 to 3 do
        begin
        for j:=1 to 3 do
        begin
          if (source[i,j]=5) and (source[i,j]<>dest[i,j]) then
          begin
            case dest[i,j] of
              6:
              begin
              swap(6,5,sender);
              end;
              7:
              begin
              swap(7,8,sender);
              swap(8,5,sender);
              end;
              8:
              begin
              swap(8,5,sender);
              end;
              9:
              begin
              swap(9,8,sender);
              swap(8,5,sender);
              end;
            end;
          end;
        end;
      end;
      //memo2.Lines.Add('对5排序完毕,结果为:');
      //Print(Sender);
      //memo2.Lines.Add('对5排序完毕-----------------------');
    //对5进行排序------------------------------------------------------------------//
    //对6进行排序------------------------------------------------------------------//
      //memo2.Lines.Add('对6排序开始-----------');
      for i:=2 to 3 do
        begin
        for j:=1 to 3 do
        begin
          if (source[i,j]=6) and (source[i,j]<>dest[i,j]) then
          begin
            case dest[i,j] of
              7:
              begin
              swap(7,8,sender);
              swap(8,9,sender);
              swap(9,6,sender);
              end;
              8:
              begin
              swap(8,9,sender);
              swap(9,6,sender);
              end;
              9:
              begin
              swap(9,6,sender);
              end;
            end;
          end;
        end;
      end;
      //memo2.Lines.Add('对6排序完毕,结果为:');
      //Print(Sender);
      //memo2.Lines.Add('对6排序完毕-----------------------');
    //对6进行排序------------------------------------------------------------------//
    //对7进行排序------------------------------------------------------------------//
      //memo2.Lines.Add('对7排序开始-----------');
      for i:=3 to 3 do
        begin
        for j:=1 to 3 do
        begin
          if (source[i,j]=7) and (source[i,j]<>dest[i,j]) then
          begin
            case dest[i,j] of
              8:
              begin
              swap(8,7,sender);
              end;
              9:
              begin
              swap(9,8,sender);
              swap(8,7,sender);
              end;
            end;
          end;
        end;
      end;
      //memo2.Lines.Add('对7排序完毕,结果为:');
      //Print(Sender);
      //memo2.Lines.Add('对7排序完毕-----------------------');
    //对7进行排序------------------------------------------------------------------////对8进行排序------------------------------------------------------------------//
      //memo2.Lines.Add('对8排序开始-----------');
      for i:=3 to 3 do
        begin
        for j:=1 to 3 do
        begin
          if (source[i,j]=8) and (source[i,j]<>dest[i,j]) then
          begin
            swap(9,8,sender);
          end;
        end;
      end;
      //memo2.Lines.Add('对8排序完毕,结果为:');
      //Print(Sender);
      //memo2.Lines.Add('对8排序完毕-----------------------');
    //对8进行排序------------------------------------------------------------------//
      

  5.   

    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.7 3 5 
    1 6 8 
    2 4 9 
    --------
    1 3 5 
    7 6 8 
    2 4 9 
    --------
    1 3 5 
    2 6 8 
    7 4 9 
    --------
    1 3 5 
    2 6 8 
    4 7 9 
    --------
    1 3 5 
    6 2 8 
    4 7 9 
    --------
    1 2 5 
    6 3 8 
    4 7 9 
    --------
    1 2 5 
    6 8 3 
    4 7 9 
    --------
    1 2 3 
    6 8 5 
    4 7 9 
    --------
    1 2 3 
    4 8 5 
    6 7 9 
    --------
    1 2 3 
    4 5 8 
    6 7 9 
    --------
    1 2 3 
    4 5 8 
    7 6 9 
    --------
    1 2 3 
    4 5 8 
    7 9 6 
    --------
    1 2 3 
    4 5 6 
    7 9 8 
    --------
    1 2 3 
    4 5 6 
    7 8 9 
    --------
      

  6.   

    Value div 3 取模 就是 纵坐标 i
    Value mod 3 取余 就是 横坐标 j