回 帖 发 新 帖 刷新版面

主题:回溯问题(帮我改改)

把1-8不重复添入下图(附件里,图片001为合适填法,002为不合适填法,毒死全家).求所有填法.
我编了一个..但......帮我改改吧....
const xx:array[1..12] of -3..3=(2,-2,2,-2,2,-2,3,-3,0,0,1,-1);
      yy:array[1..12] of -3..3=(0,0,1,-1,-1,1,0,0,-2,2,-2,2);
var tt,t:array[1..4] of 1..4;
    zb:array[1..4,1..3] of 0..1;
    a,b,i,j,k,x,y:integer;
    f:boolean;
begin
  fillchar(tt,sizeof(tt),0);
  fillchar(t,sizeof(t),0);
  fillchar(zb,sizeof(zb),0);
  tt[1]:=2;t[1]:=2;{我先把程序弄成起点2,2,但要求所有的解法}
  zb[2,2]:=1;{1:填过了,0:没填}
  i:=1;k:=2;
  repeat
    x:=tt[k-1]+xx[i];y:=t[k-1]+yy[i];
    if (x>4) or (x<1) or (y<1) or (y>3) or (((x<2) or (x>3)) and (y<>2))then begin{出界}
      inc(i);
      if i=13 then begin{所有走法都试过了}
        dec(k);i:=1;{退一步}
      end;
    end else{没出界}
      if zb[x,y]=0 then begin{没走过}
      tt[k]:=x;t[k]:=y;{横纵坐标记录}
      zb[x,y]:=1;
      inc(k);
      i:=1;
      end else begin
        inc(i);{如果走过就换走法}
      end;
    until k=1;
  for j:=1 to 8 do write(tt[j],t[j],' ');
  readln
end.

帮帮我。...

回复列表 (共1个回复)

沙发

这道题我见过的。
就是把8个数填入如下的格子里,要求每相邻的2个数在边和点上都没有任何接触。
如:                      —— ——
                         |  5 |  3 |
                         |    |    |
                     —— —— —— ——
                    |  2 |  8 |  1 |  7 |
                    |    |    |    |    |
                     —— —— —— ——
                         |  6 |  4 |
                         |    |    |
                          —— ——
我们先给这些格子编上号:
                          —— ——
                         |(1) | (2)|
                         |    |    |
                     —— —— —— ——
                    |(3) |(4) | (5)| (6)|
                    |    |    |    |    |
                     —— —— —— ——
                         |(7) | (8)|
                         |    |    |
                          —— ——
显然,凡是有接触的(边或点)格子都不能填相邻的数字。
与(1)接触的格子:(2) (3) (4) (5)
与(2)接触的格子:(1) (4) (5) (6)
与(3)接触的格子:(1) (4) (7)
与(4)接触的格子:(1) (2) (3) (5) (7) (8)
与(5)接触的格子:(1) (2) (4) (6) (7) (8)
与(6)接触的格子:(2) (5) (8)
与(7)接触的格子:(3) (4) (5) (8)
与(8)接触的格子:(4) (5) (6) (7)

这样可以建立一个a(8, 8)的BOOLEAN数组:
     (y) 1  2  3  4  5  6  7  8
 (x)
  1      \  F  F  F  F  T  T  T  
  2      F  \  T  F  F  F  T  T
  3      F  T  \  F  T  T  F  T
  4      F  F  F  \  F  T  F  F
  5      F  F  T  F  \  F  F  F
  6      T  F  T  T  F  \  T  F
  7      T  T  F  F  F  T  \  F
  8      T  T  T  F  F  F  F  \
其中的元素为TRUE表示x和y不接触(可以填入相邻数字)FALSE表示x = y(用\表示)或x和y接触(不可以填入相邻数字),然后,将数字s填入第c格后,就判断:a(c, c1)(c1为s - 1 所在的格子)是不是TRUE,是,表示s可以填在这里。

我来回复

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