(真没想到飞燕又来QB了。) 这段时间,不管QB还是PASCAL,这个骑士周游问题都有很高的知名度,看来不得不宣传一下了。 骑士的周游问题有2种类型: (1)给出一张M*N的棋盘,马在左下角,要求只许往右跳,跳到右上角。 (2)给出一张N*N的棋盘,马在左上角,对马的走向不加限制,要求跳完所有格子并不重复。 分析: (程序段中[ ]扩起表示(1)形式的语句,{}扩起表示(2)形式的语句) 这道题就是回朔的问题。 (对于(1)形式: 马有4种跳法,分别是(2,1)(1,2)(-1,2)(-2,1); 对于(2)形式: 马有8种跳法,分别是(2,1)(1,2)(2,-1)(1,-2)(-1,2)(-2,1)(-1,-2)(-2,-1);) i是跳法的编号。 每次循环执行:{[i=i+1]}(试探下一种跳法) 试探跳法i:{[x=x(p)+v(i,1):y=y(p)+v(i,2)]} 接着判断这个(x,y)的位置是否合法,对于形式(1),只要判断是否出界,对于形式(2),不仅要判断是否出界,还要判断这个位置是否走过。如果合法,则前进: {[p=p+1:s(p)=i:x(p)=x:y(p)=y]}{:a(x,y)=2:st(x,y)=p} 如果i不合法,后退: {[i=s(p)]} {IF p>0 THEN a(x,y)=0:st(x,y)=0} {[p=p-1]} 结束循环的条件:p=0或者到达终点: [x=1 AND y=N] {p=n*n} 如果P=0则无解,否则输出路线。

评论