主题:求助:两个图形的编程思路和方法!!!
jwj001
[专家分:0] 发布于 2005-10-24 14:43:00
第一个
1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7
第二个
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
回复列表 (共10个回复)
沙发
飞鸟12 [专家分:2830] 发布于 2005-10-24 23:20:00
locate row,col ' 行,列
locate row+drow,col+dcol '行增量,列增量
板凳
jwj001 [专家分:0] 发布于 2005-10-25 08:47:00
能否说的在明确些.
3 楼
staa [专家分:3690] 发布于 2005-10-26 02:21:00
很久没做过这类题了,今天试着做第一题,方法很笨:
DECLARE FUNCTION zf$ (cd!, s!)
INPUT "N="; n '正方形的边长
if n<2 or n>20 then end
DIM a(n, n)
ds = 1 '上界
dx = n '下界
dz = 2 '左界
dy = n '右界
nn = n * n '最大数
fx = 1 '方向。1-向下,2-向右,3-向上,4-向左
a(1, 1) = 1
x = 1 '当前数的X轴的值。最左为1,向右增大
y = 1 '当前数的Y轴的值。最上为1,向下增大
i = 1 '当前数。最小为1,最大为nn
DO
IF fx = 1 THEN
IF y = dx THEN
dx = dx - 1
fx = fx + 1
x = x + 1
ELSE
y = y + 1
END IF
i = i + 1
a(y, x) = i
IF i = nn THEN EXIT DO
END IF
IF fx = 2 THEN
IF x = dy THEN
dy = dy - 1
fx = fx + 1
y = y - 1
ELSE
x = x + 1
END IF
i = i + 1
a(y, x) = i
IF i = nn THEN EXIT DO
END IF
IF fx = 3 THEN
IF y = ds THEN
ds = ds + 1
fx = fx + 1
x = x - 1
ELSE
y = y - 1
END IF
i = i + 1
a(y, x) = i
IF i = nn THEN EXIT DO
END IF
IF fx = 4 THEN
IF x = dz THEN
dz = dz + 1
fx = 1
y = y + 1
ELSE
x = x - 1
END IF
i = i + 1
a(y, x) = i
IF i = nn THEN EXIT DO
END IF
LOOP
lnn = LEN(LTRIM$(RTRIM$(STR$(nn)))) + 1
FOR y = 1 TO n
FOR x = 1 TO n
PRINT zf$(lnn, a(y, x));
NEXT
PRINT
NEXT
FUNCTION zf$ (cd, s) '这个函数是为了数据排列整齐
zf0$ = LTRIM$(RTRIM$(STR$(s)))
lzf = LEN(zf0$)
zf$ = SPACE$(cd - lzf) + zf0$
END FUNCTION
楼主第一题的图形的边长是4,这个程序是可以计算的,5也可以,但不要超过20。
4 楼
jwj001 [专家分:0] 发布于 2005-10-26 08:07:00
谢谢staa,就是太麻烦了,应该还有更简单的思路.
5 楼
moz [专家分:37620] 发布于 2005-10-26 11:06:00
我不记得我什么时候做过这种题目了
第一题的第一种方法:
DEFINT A-Z
INPUT a
b = a * 2
d = a
c = 1 - d
DIM h(a * a)
FOR i = b TO 2 STEP -1
FOR j = 1 TO i \ 2
c = c + d
g = g + 1
h(c) = g
NEXT
d = (a + 1 - ABS(d)) * (d \ a - d MOD a)
NEXT
FOR i = 1 TO a * a
PRINT USING "###"; h(i);
IF i MOD a = 0 THEN PRINT
NEXT
第一题的第二种解法:
DEFINT A-Z
INPUT a
IF a > 25 THEN END
CLS
b = a * 2
x1 = 1
y = 1
FOR i = b TO 2 STEP -1
FOR j = 1 TO i \ 2
x = x + x1
y = y + y1
g = g + 1
LOCATE x, y
PRINT USING "###"; g;
NEXT
IF x1 = 0 THEN
x1 = -y1 \ 3
y1 = 0
ELSE
y1 = x1 * 3
x1 = 0
END IF
NEXT
有了第一题,第二题就简单多了:
DEFINT A-Z
INPUT a
IF a > 25 THEN END
CLS
b = a * 2
x1 = 1
y = 1
FOR i = b TO 2 STEP -1
if x1=1 then g=g+1 '[color=0000FF]这里加一句就行了[/color]
FOR j = 1 TO i \ 2
x = x + x1
y = y + y1
'g = g + 1 [color=0000FF]这一句不要[/color]
LOCATE x, y
PRINT USING "###"; g;
NEXT
z1 = x1
x1 = -y1 \ 3
y1 = z1 * 3
NEXT
6 楼
cixiqianjin [专家分:0] 发布于 2005-10-26 19:22:00
我觉得你们的程序虽然也能调试出来,但是让人理解还是有一点困难的
下面是我自己理解的一种算法
CLS
INPUT n
DIM a(n, n)
k = (n + 1) \ 2 '循环次数
FOR i = 1 TO k
x = x + 1
a(i, i) = x
FOR p = i + 1 TO n + 1 - i '
x = x + 1
a(p, i) = x
NEXT p
FOR b = i + 1 TO n - i + 1
x = x + 1
a(n - i + 1, b) = x
NEXT b
FOR c = n - i TO i STEP -1
x = x + 1
a(c, n - i + 1) = x
NEXT c
FOR d = n - i TO i + 1 STEP -1
x = x + 1
a(i, d) = x
NEXT d
NEXT i
FOR i = 1 TO n
FOR j = 1 TO n
PRINT TAB((j - 1) * 5); a(i, j);
NEXT j
NEXT i
END
我觉得比较简单,请高手多多指教
7 楼
moz [专家分:37620] 发布于 2005-10-26 19:51:00
我觉得你们的程序虽然也能调试出来,但是让人理解还是有一点困难的
下面是我自己理解的一种算法
CLS
print " 1 12 11 10 "
print " 2 13 16 9 "
print " 3 14 15 8 "
print " 4 5 6 7 "
我觉得比较简单,请高手多多指教
8 楼
cixiqianjin [专家分:0] 发布于 2005-10-26 20:03:00
你的方法也太高明了,但是一点也没有通用性
9 楼
staa [专家分:3690] 发布于 2005-10-28 16:07:00
其实我的算法应该是很好理解的:
先向下走,碰到墙就向左转,力气耗尽了就停止。
只是这四面墙都在向中间移动中,所以它转的圈子越来越小。
10 楼
moz [专家分:37620] 发布于 2005-10-28 22:46:00
其实我的算法也不难理解的:
我把你的四面墙都藏起来了,没见到墙都知道转弯了,利害吧?
我来回复