回 帖 发 新 帖 刷新版面

主题:[讨论]2004年第四题速度太慢了!!!

2004年第四题
2004-4
 对于正整数N(3<=N<=20),可以画出N阶的回形方阵.如N=7,则方阵为:
1  1  1  1  1  1  1
1  2  2  2  2  2  1
1  2  3  3  3  2  1
1  2  3  4  3  2  1
1  2  3  3  3  2  1
1  2  2  2  2  2  1
1  1  1  1  1  1  1
对于N阶回形矩阵,从左上角出发,每步可向右或向下走一格,走N*2-2步,可以到达右下角.
我们把这样的路径上所有格子中的数值之和,叫做该路径的长度.
本题要求,对于给出的N值,求出N阶回形矩阵有多少路径的长度为素数?
如N=3时,路径长度有
1  1  1    1  1  1    1  1  1
1  2  1    1  2  1    1  2  1
1  1  1    1  1  1    1  1  1
长度=5     长度=6     长度=6

1  1  1    1  1  1    1  1  1
1  2  1    1  2  1    1  2  1
1  1  1    1  1  1    1  1  1
长度=6     长度=6     长度=5

因此说,3阶回形矩阵有2条路径的长度为素数

我的方法是:
CLS
INPUT N
DIM A(N, N), S(100), X(100), Y(100), B(10000)
FOR I = 1 TO (N + 1) \ 2
 FOR J = 1 TO (N + 1) \ 2
  IF I > J THEN A(I, J) = J ELSE A(I, J) = I
  A(I, N + 1 - J) = A(I, J)
  A(N + 1 - I, J) = A(I, J)
  A(N + 1 - I, N + 1 - J) = A(I, J)
 NEXT J
NEXT I
FOR I = 2 TO N * N
   F = 0
   FOR J = 2 TO INT(SQR(I))
      IF I MOD J = 0 THEN F = 1: EXIT FOR
   NEXT J
   IF F = O THEN B(I) = I
NEXT I
FOR I = 1 TO 2
 READ v(I, 1), v(I, 2)
NEXT I
DATA 0,1,1,0
P = 1: X = 1: Y = 1: X(P) = X: Y(P) = Y: I = 0
WHILE P > 0
 I = I + 1
 IF I <= 2 THEN
  X = X(P) + v(I, 1): Y = Y(P) + v(I, 2)
  IF X >= 1 AND X <= N AND Y >= 1 AND Y <= N THEN
   P = P + 1
   S(P) = I
   X(P) = X
   Y(P) = Y
   I = 0
   IF X = N AND Y = N THEN GOSUB 10
 END IF
 ELSE I = S(P)
  P = P - 1
  X = X - X(P)
  Y = Y - Y(P)
 END IF
WEND
PRINT T#
END
10 S = 0
FOR M = 1 TO P
S = S + A(X(M), Y(M))
NEXT M
IF B(S) <> 0 THEN T# = T# + 1
RETURN
当N大于10的时候速度非常慢!
大虾们帮我改进一下!!!!!!

回复列表 (共4个回复)

沙发

链接:[url=http://www.programfan.com/club/showbbs.asp?id=183046]大虾帮我改进一下吧[/url]

declare sub addnext (i@, j@, c$)
declare sub addtos (a$, b@, c$)
defcur a-z
cls
input "n=", n
l = (n + 1) * n / 2
dim shared s$(n, n), z(l), m, nm1!
m = n
nm1! = (n + 1) / 2

z(2) = 2
for i = 3 to l step 2
    for j = 1 to i - 1
        if z(j) <> 0 then if i mod z(j) = 0 then exit for
    next
    if j >= i then z(i) = i
next

s$(1, 1) = mkc$(1) + mkc$(1)
for i = 1 to n
    for j = 1 to i
        if j = n then exit for
        addnext (i + 1), (j), (s$(i, j))
        addnext (i), (j + 1), (s$(i, j))
        s$(i, j) = ""
next j, i
        
a$ = s$(n, n)
for i = 1 to len(a$) step 16
    x = cvc(mid$(a$, i, 8))
    y = cvc(mid$(a$, i + 8, 8))
    print x; y,
    if z(x) = x then sumy@ = sumy@ + y
next
print
print sumy@

sub addnext (i, j, c$)
    if j > i or i > m or j > m then exit sub
    p = nm1! - abs(i - nm1!)
    q = nm1! - abs(j - nm1!)
    if q < p then swap p, q
    addtos c$, p, s$(i, j)
    if j = i then addtos c$, p, s$(i, j)
end sub

sub addtos (a$, b, c$)
for i = 1 to len(a$) step 16
    x = cvc(mid$(a$, i, 8)) + b
    y = cvc(mid$(a$, i + 8, 8))
    for j = 1 to len(c$) step 16
        if cvc(mid$(c$, j, 8)) = x then
           mid$(c$, j + 8, 8) = mkc$(cvc(mid$(c$, j + 8, 8)) + y)
           exit for
        end if
    next
    if j > len(c$) then c$ = c$ + mkc$(x) + mkc$(y)
next
end sub

板凳

看我的
绝对很快,输12只要六秒多。
CLS
INPUT N
P = (1 + N) * N / 2
DIM A(N, N), B(P)
FOR I = 1 TO N             ‘回字矩阵
  A = 1
  FOR J = 1 TO N
    PRINT A;
    A(I, J) = A
    IF I > J THEN A = A + 1
    IF I + J > N THEN A = A - 1
  NEXT J
  PRINT
NEXT I
FOR I = N * 2 - 1 TO P        ’求在回字阵里的路径和为素数的
  B(I) = 1
  FOR J = 2 TO INT(SQR(I))
    IF I MOD J = 0 THEN B(I) = 0: EXIT FOR
NEXT J, I
I = 1                        ‘入口
J = 1
GOSUB 100                     ’递归调用
PRINT T
END                           ‘主程序结束
100
S = S + A(I, J)               ’累加路径
IF I = N AND J = N THEN T = T + B(S)        ‘判断是否为素数
J = J + 1                        ’向右走         
IF J <= N THEN GOSUB 100        ’是否是合法位
J = J - 1
I = I + 1                       ‘向下走
IF I <= N THEN GOSUB 100         ’是否是合法位 
I = I - 1
S = S - A(I, J)                  ‘多加了一个要减去
RETURN

3 楼


你用的是普通回溯但当然慢,我用的是递归!
[em1][em2][em1]

4 楼

用递归的好~!

我来回复

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