回 帖 发 新 帖 刷新版面

主题:[讨论]骑士游历问题

2.中国象棋的马只能走日字.现规定马初始时为一个N*M的棋盘左下角.每步只能向上或向右走至相应的位置,寻求马能跳到棋盘右上角的正确跳法.
例如:N=5,M=5时(1,1),(2,3),(3,5),(4,3),(5,5).
3.在上题的基础上,对马的走向不加限制,但要求走遍整个棋盘,且每一点不重复,求一种可能的方案.
例如:N=5,M=5.
25 22 9 14 5
10 15 6 23 8
21 24 19 4 13
16 11 2 7 18
1 20 17 12 3

回复列表 (共11个回复)

沙发

1、
TYPE arr = ARRAY[1..2048] OF INTEGER;
VAR
   a: arr; n, k, i, max, min: INTEGER;
BEGIN
    READLN(n);
    k := 1;
    FOR i:=1 TO n DO k := k * 2;
    FOR i:=1 TO k DO BEGIN
        WRITE('a[', i, ']:'); READLN(a[i]);
    END;
    max := a[1]; min := a[1];
    FOR i:=2 TO k DO BEGIN
        IF a[i] > max THEN max := a[i];
        IF a[i] < min THEN min := a[i];
    END;
    WRITE('max = ', max, 'min = ', min);
END.

板凳

我们一起合做吧!QQ532909596  我的特长是软件创作 我会让你们有很多的软件开发的

3 楼

2 3呢?

4 楼

2、
TYPE
   arr1 = ARRAY[1..32, 1..32] OF INTEGER;
   arr2 = ARRAY[1..1024] OF INTEGER;
CONST
    v: ARRAY[1..4, 1..2] OF INTEGER = ((-2, 1), (-1, 2), (1, 2), (2, 1));
VAR
   a: arr1; p, xx, yy: arr2; i, x, y, m, n, step: INTEGER;
PROCEDURE pri;
VAR
   j: INTEGER;
BEGIN
    FOR j:=0 TO step - 1 DO WRITE('(', xx[j], ', ', yy[j], '), ');
    WRITELN('(', xx[step], ', ', yy[step], ')');
    HALT;
END;
BEGIN
    READLN(n, m);
    x := n; y := 1;
    step := 0; i := 0; p[step] := i; xx[step] := x; yy[step] := y;
    REPEAT
         i := i + 1;
         IF i <= 4 THEN BEGIN
            x := xx[step] + v[i, 1]; y := yy[step] + v[i, 2];
            IF (x >= 1) AND (y >= 1) AND (x <= n) AND (y <= m) THEN BEGIN
               step := step + 1; p[step] := i; xx[step] := x; yy[step] := y;
               i := 0;
               IF (x = 1) AND (y = m) THEN pri;
            END;
         END ELSE BEGIN
            i := p[step]; step := step - 1;
         END;
    UNTIL step = 0;
END.

5 楼

Matodied
,是从左上角往右上角,呵呵,拜托改改.....

6 楼

如果从左上角开始就是把这句:
x := n; y := 1;
改为:
x := 1; y := 1;

7 楼

我试了,不行 啊...一运行就貌似遇到了HALT,没任何结果就退出了

8 楼

不是!!@!是左下角往右上角......................
(我怎么...)

9 楼

哦...不是..是要按上面的输出...:N=5,M=5时(1,1),(2,3),(3,5),(4,3),(5,5).
而你的是(5,1)(3,2)(1,3)(3,4)(1,5)

10 楼

对!忘了把v数组变位了。
(下面这个程序的输出结果是从(1,1)开始,(N,M)结束,但是路线可能跟你不一样)
TYPE
   arr1 = ARRAY[1..32, 1..32] OF INTEGER;
   arr2 = ARRAY[1..1024] OF INTEGER;
CONST
    v: ARRAY[1..4, 1..2] OF INTEGER = ((2, 1), (1, 2), (-2, 1), (-1, 2));
VAR
   a: arr1; p, xx, yy: arr2; i, x, y, m, n, step: INTEGER;
PROCEDURE pri;
VAR
   j: INTEGER;
BEGIN
    FOR j:=0 TO step - 1 DO WRITE('(', xx[j], ', ', yy[j], '), ');
    WRITELN('(', xx[step], ', ', yy[step], ')');
    HALT;
END;
BEGIN
    READLN(n, m);
    x := 1; y := 1;
    step := 0; i := 0; p[step] := i; xx[step] := x; yy[step] := y;
    REPEAT
         i := i + 1;
         IF i <= 4 THEN BEGIN
            x := xx[step] + v[i, 1]; y := yy[step] + v[i, 2];
            IF (x >= 1) AND (y >= 1) AND (x <= n) AND (y <= m) THEN BEGIN
               step := step + 1; p[step] := i; xx[step] := x; yy[step] := y;
               i := 0;
               IF (x = n) AND (y = m) THEN pri;
            END;
         END ELSE BEGIN
            i := p[step]; step := step - 1;
         END;
    UNTIL step = 0;
END.

我来回复

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