魔阵是用自然数1,2,3…,n平方(n为奇数),填n阶方阵的各个元素位置,使方阵的每行的元素之和、每列元素之和及主对角线元素之和均相等。奇数阶魔阵的一个算法是将自然数数列从方阵的中间一行最后一个位置排起,每次总是向右上角排(即A[i,j]的下一个是A[i-1,j+1])。但若遇以下四种情形,则应修正排数法:
(1) 列排完(即j>n时),则转排第一列;
(2) 行排完(即I<1时),则转排第n行(最后一行);
(3) 若Aij已排进一个自然数,则排原数所在位置的左边一个格子,Ai,j-1。
例如3阶方阵,则按上述算法可排成:
2 7 6
9 5 1
4 3 8
最好附上说明,马上要用的最多一个小时……
pascal奇数魔阵 源程序代码
答案:2 悬赏:0
解决时间 2021-02-19 13:53
- 提问者网友:风华是一指流沙
- 2021-02-18 16:59
最佳答案
- 二级知识专家网友:堕落奶泡
- 2021-02-18 17:42
var a:array[1..49,1..49] of integer;
n,i,j,count:longint;
begin
fillchar(a,sizeof(a),0);
readln(n);
j:=n; i:=n div 2+1; a[i,j]:=1;
for count:=2 to n*n do
begin
dec(i); inc(j);
if j>n then j:=1;
if i<1 then i:=n;
while a[i,j]<>0 do
dec(j);
a[i,j]:=count;
end;
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j]);
writeln;
end;
end.
n,i,j,count:longint;
begin
fillchar(a,sizeof(a),0);
readln(n);
j:=n; i:=n div 2+1; a[i,j]:=1;
for count:=2 to n*n do
begin
dec(i); inc(j);
if j>n then j:=1;
if i<1 then i:=n;
while a[i,j]<>0 do
dec(j);
a[i,j]:=count;
end;
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j]);
writeln;
end;
end.
全部回答
- 1楼网友:高冷不撩人
- 2021-02-18 18:04
程序已经编译通过...
运行后却发现有点问题...
经手动计算发现是题目的问题...
如果按照第(3)种情况来修正排法
那么填入4之前数阵为
2 0 0
0 0 1
0 3 0
(未填入的用0代替)
此时i,j指着3的位置,右上移一位后就指到了1的位置...
按(3)来说就是左移一格,填入4,方阵:
2 0 0
0 4 1
0 3 0
与题目中的情况不符...
请确定题目有无错...
再附上本人参照此"有可能错误"的题目所编出的程序代码
var a:array[1..49,1..49] of integer;
n,i,j,count:longint;
begin
fillchar(a,sizeof(a),0);
readln(n);
j:=n; i:=n div 2+1; a[i,j]:=1;
for count:=2 to n*n do
begin
dec(i); inc(j);
if j>n then j:=1;
if i<1 then i:=n;
while a[i,j]<>0 do
dec(j);
a[i,j]:=count;
end;
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j]);
writeln;
end;
end.
请核实...
还有...不是说有4种情况需修正么?怎么只写了3种?
再看看别人怎么说的。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯