刚写好的算法...不过是用Delphi 写的..没有 Visual C++啊..
不过你按这个算法写绝对可以的.
procedure TForm1.Button1Click(Sender: TObject);
var
X, Y : Integer;
NX, NY : Integer;
// 动态二维数组 用于记录结构
AResult : Array of Array of Integer;
GInteger : Integer;
// 输入的数据
GRound : Integer;
// 计算圈数 (不是圈数,是边的次数)
NCount : Integer;
// 当前边的 数字个数 // 第一 N 表示 Now
NNumber : Integer;
// 当前应打印的数字 // 第一 N 表示 Now
i : Integer;
j : Integer;
Flat : Boolean;
GString : String;
begin
GInteger := StrToInt(Trim(Edit1.Text));
SetLength(AResult, GInteger, GInteger);
// 分配 AResult 数组的 空间
// 先记录第一行
for i := 1 to GIntegerdo
AResult[i - 1, 0] := i;
X := GInteger - 1;
Y := 0;
// 经过计算, 边数为 (GInteger - 1) * 2
// 当然下面的方法也是对的
// GRound := 0;
// for i := 1 to GInteger - 1do
// GRound := i + i;
GRound := (GInteger - 1) * 2;
// 边数
NCount := GInteger - 1;
// 当前边的 数字个数
NNumber := GInteger + 1;
// 当前应打印的数字
Flat := True;
for i := 1 to GRounddo
begin
Case i Mod 4 of
1 : NY := 1;
2 : NX := -1;
3 : NY := -1;
0 : NX := 1;
end;
for j := NCountdo
wnTo 1do
begin
if Flat = True then
Y := Y + NY
else
X := X + NX;
AResult[X, Y] := NNumber;
NNumber := NNumber + 1;
end;
Flat := Not Flat;
if (i Mod 2) = 0 then
NCount := NCount - 1;
end;
// 结果是保存在 AResult 数组中的...
// 下部分是显示结果出来..
for i := 0 to GInteger - 1do
begin
GString := '';
for j := 0 to GInteger - 1do
GString := GString + ' ' + IntToStr(AResult[j, i]);
Memo1.Lines.Add(GString);
end;
end;