要求:
求出任意两点间的最短路径、最短路径个数及所有最短路径上的点
解决方法:找出从源点S出发到达目的点D的所有路径长度小于6的路径,然后再从这些路径中寻找最短路径。
该算法效率稍低。
源程序如下(程序提供三种输入方法:求所有任意两点间的最短路径、个数及其点;求出这些数据并写入文件,输入两点坐标):
/**/
/************************************************************************
* 骑士遍历任意两点,求其长度小于等于6的路径个数,最短路径及其个数
************************************************************************/
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#include
<
STDIO.H
>
#include
<
STDLIB.H
>
#include
<
CONIO.H
>
#include
<
string
.h
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#define
MAXLENGTH 8
//
棋盘边长
#define
MAXSTEP 10
//
最大步数
#define
MAXPATH 1000
//
所有路径最多个数
#define
FILENAMELENGTH 100
//
文件名长度
#define
MAXMINSTEP 6
//
最短步长最大数
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
定义棋盘点(i,j),i 为行,j为列
typedef
struct
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int i; //棋盘上点行下标
int j; //棋盘上点列下标
}
ChessPoint;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
定义路径数据结构
typedef
struct
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
ChessPoint curpath[MAXSTEP]; //该条路径的路径数组
int curstep; //该条路径的步数
}
ALLPATH;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
int
chess[MAXLENGTH
+
1
][MAXLENGTH
+
1
]
=
...
{
0}
;
//
棋盘,行列下标均从1开始
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
int
offseti[
9
]
=
...
{
0,-2,-1,+1,+2,+2,+1,-1,-2}
;
//
i下标增量数组
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
int
offsetj[
9
]
=
...
{
0,+1,+2,+2,+1,-1,-2,-2,-1}
;
//
j下标增量数组
int
pathcount
=
0
;
//
路径的个数
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
int
pathstep[MAXPATH]
=
...
{
0}
;
//
每一条路径步数数组
int
maxpathcount
=
0
;
//
路径个数最大值
int
maxminstep
=
0
;
//
最短路径个数最大值
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/************************************************************************
* 方向数组,存放已经走过的每一步的走向
* 该数组初始化为0,第0号单元不用,第i个单元存放第i步的走向
* 当前活动单元索引号为step
************************************************************************/
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
int
direction[MAXSTEP]
=
...
{
0}
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/************************************************************************
* 路径数组,存放已经走过的每一步走向到达的点
* 该数组初始化为0,第0号单元存放源点(srci,srcj)
* 第i个单元存放第i-1个单元的点沿direction[i]方向走一步后的新点
* 当前活动单元索引号为step
************************************************************************/
ChessPoint path[MAXSTEP];
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/************************************************************************
* 任意两点间所有路径数组,存放两点间的每一条路径
* 该两点间的路径总数存于pathcount变量中
************************************************************************/
ALLPATH allpath[MAXPATH];
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/************************************************************************
* 函数说明:
* knight 在点(i,j) 沿着 k 方向走一步,到达新点 (newi,newj)
* 参数说明:
* i : 走一步前的行下标 (i>=1 and i<=8)
* j : 走一步前的列下标 (j>=1 and j<=8)
* k : 方向 (k>=1 and k<=8)
* newi : 走一步后的行下标 (newi>=1 and newi<=8)
* newj : 走一步后的列下标 (newj>=1 and newj<=8)
************************************************************************/
void
new_point_at_direction(
int
i,
int
j,
int
k,
int
&
newi,
int
&
newj)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
newi=i+offseti[k];
newj=j+offsetj[k];
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/************************************************************************
* 函数说明:
* 判断 knight 到达的新点 (newi,newj) 是否在棋盘上
* 参数说明:
* newi : 新点行下标 (newi>=1 and newi<=8)
* newj : 新点列下标 (newj>=1 and newj<=8)
* 返回值说明:
* true : 新点在棋盘上
* false: 新点不在棋盘上
************************************************************************/
bool
new_point_is_on_chessboard(
int
newi,
int
newj)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if((newi>=1 && newi<=MAXLENGTH) && (newj>=1 && newj<=MAXLENGTH))
return true;
return false;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
求解前初始化各种参数初始化
void
initialize()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
pathcount=0;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
for(int i=0;i<MAXLENGTH+1;i++)
for(int j=0;j<MAXLENGTH+1;j++)
chess[i][j]=0;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
for(int k=0;k<MAXPATH;k++)
pathstep[k]=0;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
for(k=0;k<MAXSTEP;k++)
path[k].i=path[k].j=0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/************************************************************************
* 函数说明:
* 骑士knight 从源点(srci,srcj) 走到目的点(desti,destj)
* 参数说明:
* srci : 源点行下标 (srci>=1 and srci<=8)
* srcj : 源点列下标 (srcj>=1 and srcj<=8)
* desti : 目的行下标 (desti>=1 and desti<=8)
* destj : 目的列下标 (destj>=1 and destj<=8)
* minstep : 从源点到目的点的最短路径步数
************************************************************************/
//
int knight_walk(int srci,int srcj,int desti,int destj)
void
knight_walk(
int
srci,
int
srcj,
int
desti,
int
destj)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
//初始化棋盘和其他参数
initialize();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
if(srci==desti && srcj==destj)
//return 0;
return ;