主题:大虾帮我改进一下吧
mxalbert1996
[专家分:780] 发布于 2006-07-23 18:06:00
1.[题目]
在N*N的棋盘上(1<=N<=10)填入1,2...N*N共N*N个数,使得任意两个相邻的数之和为素数.
例如:当N=2时,有:
1 2 其相邻的和为素数的有:
4 3 1+2,1+4,4+3,2+3
在这里我们约定:左上角的格子里必须放1.
[程序]
CLS
INPUT "Please input N: ", N
IF N < 2 THEN 2
DIM A(N, N), B(N * N)
FOR I = 1 TO N * N: B(I) = I: NEXT I
DO
FOR I = 1 TO N * N
X = I \ N + 1: Y = I MOD N
IF I MOD N = 0 THEN X = X - 1: Y = N
A(X, Y) = B(I)
NEXT I: F = 1
FOR I = 1 TO N
FOR J = 1 TO N
IF I < N THEN
P = A(I, J) + A(I + 1, J)
GOSUB 10
IF Q = 0 THEN GOTO 1
END IF
IF J < N THEN
P = A(I, J) + A(I, J + 1)
GOSUB 10
GOSUB 10
IF Q = 0 THEN GOTO 1
END IF
NEXT J
NEXT I
IF F = 1 THEN
FOR I = 1 TO N
FOR J = 1 TO N
PRINT USING "####"; A(I, J);
NEXT J: PRINT
NEXT I: END
END IF
1 J = N * N: K = N * N
WHILE B(J) < B(J - 1) AND J > 1: J = J - 1: WEND
IF J = 1 THEN EXIT DO
WHILE B(K) < B(J - 1): K = K - 1: WEND
SWAP B(J - 1), B(K)
FOR I = J TO N * N - 1
FOR K = I + 1 TO N * N
IF B(I) > B(K) THEN SWAP B(I), B(K)
NEXT K
NEXT I
LOOP
2 PRINT "NO!"
END
10 Q = 1
IF P < 2 THEN Q = 0: RETURN
FOR K = 2 TO SQR(P)
IF P MOD K = 0 THEN Q = 0: RETURN
NEXT K
RETURN
速度特别慢.
2.[题目]
对于正整数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时,路径长度有
[b]1 1 1[/b] [b]1 1[/b] 1 [b]1 1[/b] 1
1 2 [b]1[/b] 1 [b]2 1[/b] 1 [b]2[/b] 1
1 1 [b]1[/b] 1 1 [b]1[/b] 1 [b]1 1[/b]
长度=5 长度=6 长度=6
[b]1[/b] 1 1 [b]1[/b] 1 1 [b]1[/b] 1 1
[b]1 2 1[/b] [b]1 2[/b] 1 [b]1[/b] 2 1
1 1 [b]1[/b] 1 [b]1 1[/b] [b]1 1 1[/b]
长度=6 长度=6 长度=5
因此说,3阶回形矩阵有2条路径的长度为素数.
[程序]
CLS
INPUT "Please input N: ", N
DIM A(N, N), B(2 * N - 1, 2), C(N, N), D(N * 2 - 1 TO N * (N + 1) / 2)
FOR I = 1 TO (N + 1) \ 2
FOR J = 1 TO (N + 1) \ 2
IF I <= J THEN A(I, J) = I ELSE A(I, J) = J
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
J = 1: X = 1: Y = 1: S = 1
DO
F = 1
DO
B(J, 1) = X: B(J, 2) = Y: J = J + 1: S = S + A(X, Y)
IF X = N OR Y = N THEN
C(X, Y) = 1
IF X = N THEN Y = Y + 1 ELSE X = X + 1
ELSE
C(X, Y) = 2
Y = Y + 1
END IF
LOOP UNTIL J = 2 * N - 1
IF D(S) = 1 THEN F = 0: GOTO 1
IF D(S) = 2 THEN 1
FOR I = 2 TO SQR(S)
IF S MOD I = 0 THEN F = 0: EXIT FOR
NEXT I: D(S) = F + 1
1 IF F = 1 AND S <> 1 THEN T = T + 1
FOR I = J TO 1 STEP -1
IF C(B(I, 1), B(I, 2)) = 2 THEN EXIT FOR
NEXT I
IF I = 0 THEN EXIT DO
X1 = B(I, 1): Y1 = B(I, 2): C(X1, Y1) = 1
X = X1 + 1: Y = Y1: J = I + 1: S = 1
FOR I = 1 TO J - 1
S = S + A(B(I, 1), B(I, 2))
NEXT I
LOOP
PRINT "S ="; T
END
N小的时候还好,大的时候速度特别慢.
上面的两题请大虾们帮俺改进一下或是给出一种不同的算法,谢啦~~
回复列表 (共19个回复)
沙发
moz [专家分:37620] 发布于 2006-07-24 08:49:00
先说第一题,
你的1是用来对排列处理的,
10是用来质数判断处理的.
要加快速度是可以的,
你考虑一下怎样过滤一些组合,
用数组的速度是比较快的.
在质数判断那里,建议使用函数来处理,
我试试在你的基础上修改一下看看吧.
板凳
moz [专家分:37620] 发布于 2006-07-24 10:28:00
旧代码已被删除,有需要请看下面更新
3 楼
moz [专家分:37620] 发布于 2006-07-24 11:24:00
旧代码已被删除,有需要请看后面更新.
4 楼
mxalbert1996 [专家分:780] 发布于 2006-07-24 18:53:00
第一题是对的 但速度还是很慢 能不能在8秒钟内出来???
输出时矩阵下面的那个数字是什么意思???
他那上面还有一个条件 如果有多种解那么只要输出其中第一行或第一列和为最小的一种 这怎么写???
第二题N>11时 if k > len(z$) then z$ = z$ + chr$(i) 这句非法函数调用 应该怎么解决???
chr$(2) + chr$(3) + chr$(5) 是什么东东???
请大师给我解决一下以上问题 谢啦!?
5 楼
mxalbert1996 [专家分:780] 发布于 2006-07-24 19:34:00
第一题我想到一个方法 先在1行1列放1然后找到>1的一个素数2 但2=1+1重复了那就再看3 3=1+2 2是素数所以1行2列放2 放完一行后第2行第一个就要和上面的加 第二个要同时和左边的上面的加的和符合要求 如果有一个元素出现没有符合要求的数就退回上一个元素再找更大的 直到全部填满
我觉得这应该是可行的 但我还不会编 请大师指点一下!!!
6 楼
mxalbert1996 [专家分:780] 发布于 2006-07-24 19:38:00
对了 我第一题试过的 就是速度慢 没有错误啊!?
7 楼
moz [专家分:37620] 发布于 2006-07-25 22:01:00
旧代码已被删除
8 楼
moz [专家分:37620] 发布于 2006-07-26 02:08:00
第一题,可以在三秒内出结果了.
defint a-z
cls
input "n="; n
if n < 2 then end
nn = n * n
dim z(nn)
z(0) = 1
z(1) = 2
for i = 3 to nn * 2 step 2
for j = 1 to z(0)
if i mod z(j) = 0 then exit for
next
if j > z(0) then
z(0) = z(0) + 1
z(z(0)) = i
end if
next
dim a(nn), b(nn, z(0)), c(nn)
for i = 1 to nn
for j = 1 to z(0)
if z(j) > i then
if z(j) - i > nn then exit for
b(i, 0) = b(i, 0) + 1
b(i, b(i, 0)) = z(j) - i
end if
next
next
a(0) = 2
a(1) = 1
c(1) = 1
do
k1 = a(a(0)) + 1
i1 = 1
i2 = 1
g = 0
do
if a(0) > n then
j = a(a(0) - n)
for i1 = i1 to b(j, 0)
if b(j, i1) >= k1 then
if c(b(j, i1)) = 0 then
g = 1
k1 = b(j, i1)
exit for
end if
end if
next
if g < 1 then exit do
end if
k = k1
if a(0) mod n <> 1 then
j = a(a(0) - 1)
for i2 = i2 to b(j, 0)
if b(j, i2) >= k1 then
if c(b(j, i2)) = 0 then
g = 2
k1 = b(j, i2)
exit for
end if
end if
next
if g < 2 then exit do
end if
loop until k = k1
if g = 0 then
a(a(0)) = 0
a(0) = a(0) - 1
c(a(a(0))) = 0
if a(a(0)) < i4 then i4 = a(a(0))
else
a(a(0)) = k1
c(k1) = k1
a(0) = a(0) + 1
end if
if a(0) <= 1 then
print "no"
end
end if
loop until a(0) > nn
for i = 1 to nn
print using "###"; a(i);
if i mod n = 0 then print
next
9 楼
mxalbert1996 [专家分:780] 发布于 2006-07-26 21:39:00
对不起 一个人在一个主题中所得的专家分最多不能超过50分! 不能给你加分~~
10 楼
moz [专家分:37620] 发布于 2006-07-26 23:12:00
第二题我算到路径的总数了.
declare function fen@ (a@, b@)
defcur a-z
m = 25
dim shared s(m, m)
cls
for n = 1 to m
print n, fen(n, n)
next
function fen (a, b)
if a = 1 or b = 1 then
s(a, b) = 1
elseif s(a, b) = 0 then
s(a, b) = fen(a - 1, b) + fen(a, b - 1)
end if
fen = s(a, b)
end function
按照题目的要求,所谓的长度应该是
从 2*n-1 到 ((n\2)+1)*(n\2)*2 + ((n mod 2)-1)*(n\2) + (n mod 2)*(n\2+1) 之间
是个开区间,但具体数量怎么分布,我就还没有头绪.
区间 [ 2*n+1 , ∑n ]
我来回复