主题:【W求助】间隔排列
[center]间隔排列(ARRANGE)[/center]
提交文件名:ARRANGE.PAS
问题描述:
有2N个木块,每个木块标上1到N的自然数中的一个,当然,每个数字会出现在两个木块上。下面把这些木块排成一排,要求是:标号为1的两个木块之间要间隔一个其它木块;标号为2的两个木块之间要间隔两个其它木块;……标号为N的两个木块之间要间隔N个其它木块。
问题求解:
编程实现,对给定的N(3≤N≤40),求出一种可行的排列;如果没有可行的排列,则输出“No answer !”。
输入输出示例:
N = 3
3 1 2 1 3 2
这是原题 我的编译如下
var a:array[0..90] of integer;
i,j,n:integer;
t,b:boolean;
procedure check;
var p,q:integer;
begin
b:=false;
for p:=1 to 2*n do
if ((p+2<=2*n) and (a[p]=0) and (a[p+2]=0)) or
((p-2>=1) and (a[p]=0) and (a[p-2]=0))
then
b:=true;
end;
procedure print;
var m:integer;
begin
for m:=1 to 2*n do
if a[m]<>0 then write(a[m]:3) else write(' 1');
writeln;t:=false;
halt;
end;
procedure put(c:integer);
var i,j:integer;
begin
if c=1 then check;
if (c=1) and b and t then print;
if (c=1) and not b then exit;
for i:=1 to 2*n do
begin
if a[i]<>0 then continue;
a[i]:=c;
if (i+c+1<=n*2) and (a[i+c+1]=0) then begin a[i+c+1]:=c;put(c-1);a[i+c+1]:=0;end;
a[i]:=0;
end;
end;
begin
write('N = ');
readln(n);
if n mod 4 in [1..2] then writeln('No Answer !')
else
begin
fillchar(a,sizeof(a),0);
b:=false;t:=true;
put(n);
end;
end.
当输入除以四余1 或 2 的时候肯定无解这是没有争议的,但是在输入36 39 时 我的程序就会超时 但40以后都没问题 请帮忙检查一下 或者说告诉我怎样更好的剪枝
提交文件名:ARRANGE.PAS
问题描述:
有2N个木块,每个木块标上1到N的自然数中的一个,当然,每个数字会出现在两个木块上。下面把这些木块排成一排,要求是:标号为1的两个木块之间要间隔一个其它木块;标号为2的两个木块之间要间隔两个其它木块;……标号为N的两个木块之间要间隔N个其它木块。
问题求解:
编程实现,对给定的N(3≤N≤40),求出一种可行的排列;如果没有可行的排列,则输出“No answer !”。
输入输出示例:
N = 3
3 1 2 1 3 2
这是原题 我的编译如下
var a:array[0..90] of integer;
i,j,n:integer;
t,b:boolean;
procedure check;
var p,q:integer;
begin
b:=false;
for p:=1 to 2*n do
if ((p+2<=2*n) and (a[p]=0) and (a[p+2]=0)) or
((p-2>=1) and (a[p]=0) and (a[p-2]=0))
then
b:=true;
end;
procedure print;
var m:integer;
begin
for m:=1 to 2*n do
if a[m]<>0 then write(a[m]:3) else write(' 1');
writeln;t:=false;
halt;
end;
procedure put(c:integer);
var i,j:integer;
begin
if c=1 then check;
if (c=1) and b and t then print;
if (c=1) and not b then exit;
for i:=1 to 2*n do
begin
if a[i]<>0 then continue;
a[i]:=c;
if (i+c+1<=n*2) and (a[i+c+1]=0) then begin a[i+c+1]:=c;put(c-1);a[i+c+1]:=0;end;
a[i]:=0;
end;
end;
begin
write('N = ');
readln(n);
if n mod 4 in [1..2] then writeln('No Answer !')
else
begin
fillchar(a,sizeof(a),0);
b:=false;t:=true;
put(n);
end;
end.
当输入除以四余1 或 2 的时候肯定无解这是没有争议的,但是在输入36 39 时 我的程序就会超时 但40以后都没问题 请帮忙检查一下 或者说告诉我怎样更好的剪枝