一个算法!看看各位dfw基础知识如何。(50分)

  • 主题发起人 主题发起人 frenking
  • 开始时间 开始时间
F

frenking

Unregistered / Unconfirmed
GUEST, unregistred user!
1到9九个数,
填到三行三列的表格中,
横竖斜相加都等于15。
给出解决思路!
 
2、4为肩
6、8为足
吾(五)站中间
简单
 
to 张自骞
我要的解决思路,不是结果!
 
大家是不是嫌分数少?
 
294
753
618
另外还有一种是:-4、-3、-2、-1、0、1、2、3、4
填到三行三列的表格中,
横竖斜相加都等于0。
 
各位富翁,结果大家都知道,关键问题
用什么算法、什么思路。
 
大家都不知道还是太小儿科!
 
一、首先计算N个数的总和SUM :45;
二、得到一列应给的分数AVG :15;
三、中间的值应该是SUM div AVG :5;
四、随后以5为中心向外分发数字(对角线),注意每一线上发的数字特征为:5+n或5-n;
五、调整边界(行、列的和)。
当然,如果想的话,用程序一样可以实现的。
 
还有没有其他人发言?
 
好象这样算的话,以三三表格为最易算出。
其他的会很难的。
小儿科题目,那黄蓉当之无愧!
在你我没接触到的时候,金庸就让她做这道题了!
 
哈哈,楼上兄弟真幽默。
好,结帐!
 
接受答案了.
 

//穷举 俺苯 俺只会穷举
//反正机子快 不到1秒
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i1, i2, i3, i4, i5, i6, i7, i8, i9: integer;
mydata: array[1..3, 1..3] of integer;
from: set of 1..9;
function check: boolean;
var
i, j: integer;
sum: integer;
begin

result := false;
for i := 1 to 3do
begin
sum := 0;
for j := 1 to 3do
sum := sum + mydata[j];
if sum <> 15 then
exit;
end;
for i := 1 to 3do
begin
sum := 0;
for j := 1 to 3do
sum := sum + mydata[j];
if sum <> 15 then
exit;
end;

sum := 0;
for i := 1 to 3do
sum := sum + mydata;
if sum <> 15 then
exit;
sum := 0;
for i := 1 to 3do
sum := sum + mydata[4 - i];
if sum <> 15 then
exit;

result := true;
end;

function checkFirst: boolean;
var
myCount: array[1..9] of integer;
i, idx: integer;
begin
result := false;
for i := 1 to 9do
myCount := 0;
for i := 1 to 9do
begin
idx := mydata[(i - 1) div 3 + 1][i mod 3 + 1];
myCount[idx] := myCount[idx] + 1;
if myCount[idx] > 1 then
exit;
end;
result := true;
end;

begin
from := [1, 2, 3, 4, 5, 6, 7, 8, 9];
for i1 := 1 to 9do
for i2 := 1 to 9do
if i2 in from - [i1] then
for i3 := 1 to 9do
if i3 in from then
for i4 := 1 to 9do
if i4 in from - [i1] - [i2] - [i3] then
for i5 := 1 to 9do
if i5 in from - [i1] - [i2] - [i3] - [i4] then
for i6 := 1 to 9do
if i6 in from - [i1] - [i2] - [i3] - [i4] - [i5] then

for i7 := 1 to 9do
if i7 in from - [i1] - [i2] - [i3] - [i4] - [i5] - [i6] then

for i8 := 1 to 9do
if i8 in from - [i1] - [i2] - [i3] - [i4] - [i5] - [i6] - [i7] then
for i9 := 1 to 9do
if i9 in from - [i1] - [i2] - [i3] - [i4] - [i5] - [i6] - [i7] - [i8] then
begin
mydata[1, 1] := i1;
mydata[1, 2] := i2;
mydata[1, 3] := i3;
mydata[2, 1] := i4;
mydata[2, 2] := i5;
mydata[2, 3] := i6;
mydata[3, 1] := i7;
mydata[3, 2] := i8;
mydata[3, 3] := i9;
// if checkFirst then
if check then
begin
Memo1.lines.Add('----');
Memo1.Lines.Add(format('%d %d %d', [mydata[1, 1], mydata[1, 2], mydata[1, 3]]));
Memo1.Lines.Add(format('%d %d %d', [mydata[2, 1], mydata[2, 2], mydata[2, 3]]));
Memo1.Lines.Add(format('%d %d %d', [mydata[3, 1], mydata[3, 2], mydata[3, 3]]));
exit;
end;

end;

end;
end.

 
我已想出该算法,对(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)添到前一个格子上方(相邻的)格子里。
律师不爽。

 
呵呵,祝大家节日快乐!
to frenking
好大方,我也好高兴!
如想联系的话:我的QQ :120256542 !
 
呵呵,以前有讨论的阿,看看这个:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1381343
 

Similar threads

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