50分求购算法(有谁会)(50分)

  • 主题发起人 主题发起人 快刀不快
  • 开始时间 开始时间

快刀不快

Unregistered / Unconfirmed
GUEST, unregistred user!
我有1,2,3,4,5,6,7,8个数。要排成8行8列。这8个数字在每一行、每一列都出现1次而且
仅有1次。如只有1,2,3三个数时。排成:
1 2 3
2 3 1
3 1 2
请问各位,该如何实现这个功能。
 
经典的回溯算法,可参见有关算法方面的说,或者高级程序员的教程
 
不就是全排列吗?
procedure arr(n:Integer);
var
i,j,k:Integer;
s := String;
begin
listbox1.items.clear;
for i := 1 to n do
begin
s := '';
for j := i to i + n do
begin
k := j;
if k > n then
k := k - n;
s := s + Inttostr(k) + ',';
end;
listbox1.items.add(s);
end;
end;

 
to yisan:有没有代码?
to zhukewen,没有这么简单。我这个要求随机排列。你这个每次都是一个同样的排列。
 
拉丁方阵嘛!
 
我也知道是拉丁方,可代码?呵呵
 
先这样排,应该是很简单的。
如果你要随机:这样排以后,产生随机数,然后进行行、列交换!!!!!
你想怎么随机都可以。
 
jsxjd,这样不行,一开始就不是随机排列,不管你如何换行换列都不可能是随机排列了。你试试就知道了。
到底有没有人会啊。大家多考虑考虑。
 
算法思想:
1、建立一个一维数组(Array[1..64] of Integer)和一个Strings,数组用于保存结果,Strings用于保存初始值
  (1..8为第1行,9..16为第2行...;1,9,17..57为第1列,2,10,18..58为第2列...)
2、将数据的元素都初始化为0
3、将1,2,3..8个各生成8个,存放到Strings中,存放的顺序不必考虑,只需每个数字都是8个就可以了
4、生成一个随机数,第一次的范围在0..63中,将随机数作为Strings的Index,从Strings中取出数字,
  同时将该Index的数字删除,并将随机数的范围减1,变为0..62
5、将4中取出的数字保存到数组中,方法为:先扫描行,判断该数字是否已存在该行,如果有转到下一行,
  如果没有,则找到该行中第1个为0的元素,并同时判断该列中是否已存在该数字,如果有则转到该行
  下一个为0的元素,直到所在的列没有与其相同的数字为止
6、重复4-5,直到Strings为空;
注:如果直接使用上面的算法时,会产生对角线上的数字都一样
改进算法:保存也用随机的
即将数组的下标存放到另一个Strings中,然后每次要保存的时候就从该Strings中提取一个
下标,如果该位置符合要求,则将该下标从Strings中删除
 
说起来简单,写代码啊。你要知道这种排列有多少种吗?
 
完了,没有人知道了。yisan知道一点,不会写代码。分送不出去了。我哭
 
1 2 3 4 5 6 ......n
把它们看成是首尾相联的
第一行 1 2 3 4 5 6 ...... n 向右转一圈得 第二行--->
第二行 n 1 2 3 4 5....... n-1 向右转一圈得 第三行--->
第三行 n-1 n 1 2 3 4.........n-2
.
.
.
最后一行2 3 4 5 6 7........ 1

 
真是没办法,给了书还不想去看,休息了一天回来,还在这里叫劲,今天忙,
明天再给出源码!
 
这样的问题这样的算法在实际的应用软件开发中能用到嘛??(一个初学者的疑问)
 
program latin;
var
temp,i,j:integer;
begin
for i:=1 to 8 do
begin
temp:=i-1;
for j:=1 to 8 do
begin
temp:=temp+1;
if temp>8 then
temp:=1;
write(temp,' ');
end;
writeln;
end;
end.
 
哈哈 没有想到高一时候的代码可以现在用来骗分!
快刀不快,给分吧!谢谢了!
 
yisan,你看看竟然这样骗分来了。只有你是明白人,我期待着你。
猴王挺搞笑的,这是随机排列。你搞成什么了。quickchop说得对,这样的排列有很多种。
共有535281401586种,如果是5就少点,但是也有56种。你看你们弄的都是只有一种排列。
大家多想想,没有很便宜的东西好吃。
谁弄出代码,50分全给。
 
后退
顶部