主题:[讨论]骑士游历问题
编程小菜菜
[专家分:90] 发布于 2007-08-25 17:06:00
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
最后更新于:2007-08-26 20:31:00
回复列表 (共11个回复)
沙发
Matodied [专家分:7560] 发布于 2007-08-25 20:51:00
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.
板凳
rogerone [专家分:0] 发布于 2007-08-26 17:17:00
我们一起合做吧!QQ532909596 我的特长是软件创作 我会让你们有很多的软件开发的
3 楼
编程小菜菜 [专家分:90] 发布于 2007-08-26 20:30:00
2 3呢?
4 楼
Matodied [专家分:7560] 发布于 2007-08-26 21:13:00
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 楼
编程小菜菜 [专家分:90] 发布于 2007-08-26 21:18:00
Matodied
,是从左上角往右上角,呵呵,拜托改改.....
6 楼
Matodied [专家分:7560] 发布于 2007-08-26 21:20:00
如果从左上角开始就是把这句:
x := n; y := 1;
改为:
x := 1; y := 1;
7 楼
编程小菜菜 [专家分:90] 发布于 2007-08-26 21:37:00
我试了,不行 啊...一运行就貌似遇到了HALT,没任何结果就退出了
8 楼
编程小菜菜 [专家分:90] 发布于 2007-08-26 21:47:00
不是!!@!是左下角往右上角......................
(我怎么...)
9 楼
编程小菜菜 [专家分:90] 发布于 2007-08-26 21:50:00
哦...不是..是要按上面的输出...: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 楼
Matodied [专家分:7560] 发布于 2007-08-27 08:20:00
对!忘了把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.
我来回复