回 帖 发 新 帖 刷新版面

主题:求助:两个图形的编程思路和方法!!!

第一个
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个回复)

沙发

locate row,col    ' 行,列

locate row+drow,col+dcol    '行增量,列增量

板凳

能否说的在明确些.

3 楼

很久没做过这类题了,今天试着做第一题,方法很笨:
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 楼

谢谢staa,就是太麻烦了,应该还有更简单的思路.

5 楼

我不记得我什么时候做过这种题目了

第一题的第一种方法:

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 楼

我觉得你们的程序虽然也能调试出来,但是让人理解还是有一点困难的

下面是我自己理解的一种算法
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 楼

我觉得你们的程序虽然也能调试出来,但是让人理解还是有一点困难的

下面是我自己理解的一种算法
CLS
print " 1 12 11 10 "
print " 2 13 16 9  "
print " 3 14 15 8  "
print " 4 5  6  7  "

我觉得比较简单,请高手多多指教

8 楼

你的方法也太高明了,但是一点也没有通用性

9 楼

其实我的算法应该是很好理解的:

先向下走,碰到墙就向左转,力气耗尽了就停止。

只是这四面墙都在向中间移动中,所以它转的圈子越来越小。

10 楼

其实我的算法也不难理解的:
我把你的四面墙都藏起来了,没见到墙都知道转弯了,利害吧?

我来回复

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