描述问题
输入测试例子数T,每个例子输入棋盘大小m行n列, (1<=m,n<=500),再输入a,b,c,d表示(a,b)–>(c,d),(1<=a,c<=m)且(1<=b,d<=n)且两点不是同一点,若马走的到,输出按照马的走法(日字走法)的 最短路径的步数,否则输出0。
分析问题
最短路径,让人联想到bfs,于是我们可以用队列,若未访问过,将可走的点放入队列中,直到队列为空之前,若走到则输出最短路径所走的步数,若队列已经空而仍然未到达目标,则输出0;
代码 + 注释
#include <stdio.h>
#include <stdlib.h>
//注意,为方便数组访问,纵向为x轴,横向为y轴
typedef struct {
int x;//x坐标
int y;//y坐标
int len;//步数
}node;
typedef node* Node;
int main() {
int test_num;//测试例子数
scanf("%d",&test_num);
while(test_num --) {
int m , n;
scanf("%d %d",&m,&n);//m行n列的棋盘
//使用calloc动态分配时已初始化为0,方便
int **mark = (int **)calloc((m+1),sizeof(int *));
for(