回 帖 发 新 帖 刷新版面

主题:【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以后都没问题 请帮忙检查一下 或者说告诉我怎样更好的剪枝

回复列表 (共2个回复)

沙发

1.王建德的《高中计算机竞赛题解指导》“间隔排列”问题,提供了2种不同的搜索方式。
2. 程序arrange.pas采取第1种方式:依次试探摆放木块标号c(c=n,…,2,1)的一对可能位置。  当n≥36时,便可能出现计算超时的情况。
3. 改进后的程序命名为arrange1.pas,主要修改如下:
   (1)将用于处理木块标号c=1的过程check,合并到过程put(c)中。
   (2)定义新过程permutation,生成关于n个自然数的序列P={…,3,1,…,4,2}。
   (3)改写过程put(c)为put(c1),其中取c:=p[c1];。  


program arrange1;
var a:array[1..198] of integer;
    p:array[1..99] of integer;
    n:integer;
    t:boolean;

procedure permutation;
var i,j:integer;
begin
  j:=0; for i:=1 to n div 2 do begin j:=j+1; p[j]:=i*2; end;
  for i:=1 to (n+1) div 2 do begin j:=j+1; p[j]:=i*2-1; end;
end;

procedure print;
var m:integer;
begin
  for m:=1 to 2*n do write(a[m]:3);
  writeln;t:=false;
  halt;
end;

procedure put(c1:integer);
var c,i,j:integer;
begin
  if not t then exit;
  if c1=0 then
  begin
    print;
    exit;
  end;
  c:=p[c1];
  for i:=1 to 2*n-c-1 do
  begin
    j:=i+c+1;
    if (a[i]=0) and (a[j]=0) then
    begin
      a[i]:=c; a[j]:=c;
      put(c1-1);
      a[i]:=0; a[j]:=0;
    end;
  end;
end;

begin
  write('N = ');
  readln(n);
  if n mod 4 in [1..2] then writeln('No Answer !')
  else
  begin
    permutation;
    fillchar(a,sizeof(a),0);
    t:=true;
    put(n);
  end;
end.

板凳

1000以内的间隔排列问题的快速解法

    对上述程序arrange1.pas的输入和输出语句稍加修改,便可以快速获得1000以内的间隔排列问题的一个解。例如:

Nmin, Nmax = 3 199
******  n=3  ******
   3   1   2   1   3   2

******  n=4  ******
   2   3   4   2   1   3   1   4

......  ......  ......


******  n=198  ******
No Answer !

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


我来回复

您尚未登录,请登录后再回复。点此登录或注册