我自己刚刚写的,有点麻烦的说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
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
else if (x < x1)//其实永远不会有向下交换的
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之后再对每个点先左后右移动,直到到达预定坐标.
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进行排序------------------------------------------------------------------//
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
--------
Value mod 3 取余 就是 横坐标 j