求一算法,25个数,5行5列相加得65,对角也是65,求解(100分)

  • 主题发起人 主题发起人 QQ在线
  • 开始时间 开始时间
Q

QQ在线

Unregistered / Unconfirmed
GUEST, unregistred user!
有25个数,从1到25,要求排成五行五列的正方形状,并且每一行相加为65,每一
列相加为65,对角线相加为65,求具体的排列方法?
问题很简单,我想用穷举,但数实在大在,数据结构学的不怎样,望各位帮帮忙,谢谢各位了。
 
这个是有技巧的!!!!!!!!!!!!!!
procedure TForm1.Button1Click(Sender: TObject);
var
n,i,j,nV,nH:integer;
AN:array[0..50,0..50] of integer;
s:string;
begin
n:=5;
//任意的奇数都可以 3,5,7,9,11,13,15,17,...
nH:=n div 2;
nV:=0;
for i:=1 to n*ndo
begin
an[nh,nv]:=i;
if (i mod n)=0 then
begin
nv:=(nv+1 mod n)
end
else
begin
dec(nh);
if nh=-1 then
nh:=n-1;
dec(nv);
if nv=-1 then
nv:=n-1;
end;

end;

s:='';
for i:=0 to n-1do
begin
for j:=0 to n-1do
begin
s:=s+format('%4d',[an[i,j]]);
end;
s:=s+#13#10;
end;
showmessage(s);
end;

n=3
6 7 2
1 5 9
8 3 4
n=5
15 16 22 3 9
8 14 20 21 2
1 7 13 19 25
24 5 6 12 18
17 23 4 10 11
n=7
28 29 37 45 4 12 20
19 27 35 36 44 3 11
10 18 26 34 42 43 2
1 9 17 25 33 41 49
48 7 8 16 24 32 40
39 47 6 14 15 23 31
30 38 46 5 13 21 22
n=13
91 92 106 120 134 148 162 7 21 35 49 63 77
76 90 104 105 119 133 147 161 6 20 34 48 62
61 75 89 103 117 118 132 146 160 5 19 33 47
46 60 74 88 102 116 130 131 145 159 4 18 32
31 45 59 73 87 101 115 129 143 144 158 3 17
16 30 44 58 72 86 100 114 128 142 156 157 2
1 15 29 43 57 71 85 99 113 127 141 155 169
168 13 14 28 42 56 70 84 98 112 126 140 154
153 167 12 26 27 41 55 69 83 97 111 125 139
138 152 166 11 25 39 40 54 68 82 96 110 124
123 137 151 165 10 24 38 52 53 67 81 95 109
108 122 136 150 164 9 23 37 51 65 66 80 94
93 107 121 135 149 163 8 22 36 50 64 78 79

 
老兄,你也太历害了点,但我怎么想不通这算法,说说道理吧,OK?
介绍相关的知识/链接也行
 
其实呢这个也不难,只是你不知道算法罢了,
举个例子吧,n=3时应该是一个3*3的图型,你可以用笔画一下,就是有9个格的那种,
你在把中间的多出一个,也就是说每边的中间多出一个格了,这时你把1到9按顺序填入
斜着的行中,就是成了下面这个样子
1
4 2
7 5 3
8 6
9
这时你把她们在9格外的数字填到她们对面的空格中就解决这个问题了,对于奇数的解法就是
这个意思,对于偶数的也是大同小异,
由于有了这个特性,所以做这种魔方问题就比较简单了,
按1……n*n依规律给n维数组赋值就行了,一般呢1总是在第一行的中间,其他的你看他的算法吧
硬记着就行了
 
等我从张家界回来给你解释,你先用吧。
 
如果真的要酸饭的话,呵呵,用递归吧!
jsxjd的方法是一种直接填充的方法,不是算法。记得当初小学奥赛的时候老师讲过。不过好像谭浩强
的那本C中也有这道题,不过这种填充的方法只对方格的行数(或列数)是奇数有效 ,例如5是奇数,如果1-36就不行,
因为6是偶数。
具体做法是:(从1到25依次填)( )
1居前列正中央
依次斜填左上方
左出框时右边写
上出框时下边填
左上有舒填右边
 
franczx 的说法很对,谭浩强的那本有关TC的书里就有说到.其实他是一个叫磨方阵的东西.
 
呜呜,感觉是:地球人都知道,就我不知道,俺小学怎么没学过,初中也没学,学计算机后也没学,
各位,得,介绍两本什么书给我得了,不然我以后老找小学的题来问,我都不好意思了。
 
问题远远没有那么简单。
jsxjd的方法早有介绍,我的评论是:
1.只能处理奇数方阵
2.还没有见到对这种方法的严格的数学证明
我在十几年前曾热衷于这个问题(那时还不会使用计算机),并
手工解出6*6方阵,但并没有总结出算法。
下面是更难的问题:
* * * *
* * * * *
* * * * * *
* * * * * * *
* * * * * *
* * * * *
* * * *
要求横、左斜、右斜和相等
 
奇數是有個算法的, 但偶數就沒有發現有規律, 請問有問知道嗎, 我也想知道, 還記得以前
上課的時候在不定算這個, 曾經算到過8x8的, 奇數全部可以.
 
结账,谢谢各位了。:)
 
我已想出该算法,对等差数列的任意一段连续的(2K+1)*(2K+1)个数字填充(2K+1)*(2K+1)的格子均适用。
我的25格子的解围:
11 18 25 02 09
10 12 19 21 03
04 06 13 20 22
23 05 07 14 16
17 24 01 08 15
首先从最下面一行(2K+1)的第k个格子开始向右下方添数,如果这个格子出了边界则做以下处理:
1。如果这个格子所在的列没出边界,则将此数(如 02),防置于列的最顶端,并一此点为出发点继续向右下方添数。
2。如果这个格子所在的行没出边界,则将此数(如 04),防置于该行的最左端,并一此点为出发点继续向右下方添数。
两种特别情况:
1。当该格子所在的列与行都出了边界(如 16),把数字添到前一个格子(15)上方(相邻的)格子里。
2。当该格子已经添有(如 10的下一个位置)数字的时候,把数字(如 11)添到前一个格子上方(相邻的)格子里。
律师不爽。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
824
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部