一个数字排列问题,急啊,在线等(50分)

  • 主题发起人 主题发起人 rolim
  • 开始时间 开始时间
R

rolim

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,输入一个数n,要求排列自然数1,2,...n,使得每个自然数的位置数与自己的值不同,要求出全部解.
举例说 如果n=3,那么312 231都是答案
 
各位大哥,小弟是菜鸟,请大家帮帮忙啊!!!
 
[?]完全看不明白楼主想问什么!
 
什么叫数组下标不等于数组值呢??
楼主是不是混淆了??
 
可以参考一下,我以前写的
输入123,输出
1
2
3
12
21
23
32
123
213
312
132
231
321
//////////////////////////////////////////////////////////
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, MPlayer;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure taxis(str: string;
var retStr: TStrings);
{
str: 组合的元素,如'abcd'
retStr: 组合的结果集
}
var
i,j,i1,j1,l: Integer;
s,s1,s2: String;
begin
retStr.Clear;
for i := 1 to length(str)do
begin
for j := 1 to length(str)-i+1do
begin
s1 := copy(str,j,i);
s2 := s1;
repeat
for i1 := 1 to length(s2)do
begin
s := copy(s2,i1,1);
for j1 := 1 to length(s2)do
begin
if (i1<>j1) then
s := s + copy(s2,j1,1);
end;
if retStr.IndexOf(s)<0 then
retStr.Add(s);
end;
l := length(s1);
if l>1 then
s2:=copy(s2,l,1)+copy(s2,1,l-1)
else
until (s1=s2);
end;
end
end;

procedure TForm1.Button1Click(Sender: TObject);
var
aaa:TStrings;
begin
aaa := TStringList.Create;
taxis(edit1.text,aaa);
memo1.Clear;
memo1.Lines.AddStrings(aaa);
end;

end.
 
请再看看题目,小弟重新编辑过了
 
czcn你好,好象不对啊,和我要的关系不怎么大啊
 
帮帮忙啊,各位大哥!
 
我靠,还以为怎么了呢!!
解决这个问题的方法n 多了!
给你其中一种大概的思路吧!
你先把它们能派的都派出来,再从中把不符合资格的数删了!
例如,1 到 3 !
你先派出来,123,132,213,231,312,321
再把123,132,213,321 去掉,不就ok 了!
 
nolliman兄,这个我知道啊,但是n是自己输入的啊,难道输个8就用8重循环啊?
 
大哥,没人理我了吗?
 
czcn的程序略加改动就可以实现你说的功能了,把他输出的数据集经过过滤就可以了.
先算出小于n的自然数的n位数排列(把上面的组合改排列就行)
把结果的每个数放入二维数组A中,宽度为[n,n阶乘],再按数组元素判断.
如n=3,数组A为:
[red]A[0,0]=1[/red] [red]A[1,0]=2[/red] [red]A[2,0]=3[/red]
A[0,1]=2 A[1,1]=1 [red]A[2,1]=3[/red]
A[0,2]=3 A[1,2]=1 A[2,2]=2
[red]A[0,3]=1[/red] A[1,3]=3 A[2,3]=2
A[0,4]=2 A[1,4]=3 A[2,4]=1
A[0,5]=3 [red]A[1,5]=2[/red] A[2,5]=1
A[x,y]x从0开始所以+1后判断
如果 A[x+1,y]中的 [gold][blue]x+1=元素值[/blue][/gold] 把数组下标等于y的所在行所有元素值设为0(我用红色标出了)
把A[x,y]中值不为0的数按n位间隔输出就行了.
输出数组;
 
好象czcn兄的程序输入4个数以上就有点问题了,
不过多谢大家,小弟已经搞定.
 
后退
顶部