你会97年的第三题骑士游历问题,跪求啊,救命用啊谢谢啊,回头给积分,要多少给多少,谢谢
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你会97年的第三题骑士游历问题,跪求啊,救命用啊谢谢啊,回头给积分,要多少给多少,谢谢相关的知识,希望对你有一定的参考价值。
骑士游历(1997年全国青少年信息学(计算机)奥林匹克分区联赛高中组复赛试题第三题)
设有一个n×m的棋盘(2<=n<=50,2<=m<=50),如图1,在棋盘上任一点有一个中国象棋马,
C语言骑士游历问题
#include <stdio.h>#define N 5#define NSQUARE N*Nint HorseTry(int i, int x, int y, int h[N+1][N+1]);static int a[9] = 0, 2, 1, -1, -2, -2, -1, 1, 2;static int b[9] = 0, 1, 2, 2, 1, -1, -2, -2, -1;main() int i, j, flag, x, y; static int h[N+1][N+1] =0; printf("Input the initial position x,y:"); scanf("%d,%d", &x, &y); h[x][y] = 1; flag = HorseTry(2, x, y, h); if (flag) printf("Output:\n"); for (i=1; i<=N; i++) for (j=1; j<=N; j++) printf("%5d", h[i][j]); printf("\n"); else printf("No solution!\n"); int HorseTry(int i, int x, int y, int h[N+1][N+1]) int u, v, flag, count = 0; do count++; flag = 0; u = x + a[count]; v = y + b[count]; if ((u>=1&&u<=N) && (v>=1&&v<=N) && h[u][v]==0) h[u][v] = i; if (i < NSQUARE) flag = HorseTry(i+1, u, v, h); if (!flag) h[u][v] = 0; else flag = 1; while (!flag && count<8); return flag;这个程序我看不懂啊,谁能用语言详细解释一下啊,比如各个部分之间模块的作用
这个程序很乱 还有些地方有错误 ;本题可以使用深度搜索发求解,但是效率很低,当路径很多时,不可能在短时间内出解。可以采用动态规划的设计思想。
从(x1,y1)位置出发,按照由左到右的顺序定义阶段的方向。位于(x2,y2)的左方且可达(x2,y2)的跳马位置集合都是(x2,y2)的子问题,起点至(x2,y2)的路径数实际上等于起点至这些位置集的路径数之和。可以按照阶段的顺序依次计算每一个阶段每个点的路径数目。
阶段i:中国象棋马当前的列位置(x1≤i≤x2)
状态j:中国象棋马在i列的行位置(1≤i≤m)
每条路径走一遍,然后得出步数,比较得到最小的就行了
状态转移方程map[i,j]:起点(x1,y1)至(i,j)的路径数目 参考技术A 写规范点,不是大牛,不要把程序,搞成这样,就是别人写的,也先整好再上传嘛! Nint都没有定义
以上是关于你会97年的第三题骑士游历问题,跪求啊,救命用啊谢谢啊,回头给积分,要多少给多少,谢谢的主要内容,如果未能解决你的问题,请参考以下文章