题意
从一个起点遵循某种特殊规则走到终点,求最短的步数
分析
很显然,这题是bfs思想的应用。
1.首先输入数据,并在每次输入数据时判断起点和终点的坐标。
2.初始化队列,从起点开始按照规则进行遍历。规则是按照中国象棋马的走法,马在上下左右这四个基本方向上可以再往两个斜边走
3.每次遍历坐标都要检查坐标是否合法,是否是障碍,是否之前被遍历过(因为这题是从中心向四周扩散,如果当前坐标已被标记了,那么就说明路径往回走了,就说明走重复了,也就说明不是最短路)
4.对坐标进行应有的操作,在这道题中,是对原来坐标可以走的步数+1,并判断是否找到终点
PS: 这题有个巨坑,输入数据的第一个竟然是列数!!!
代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
typedef pair<int,int> PII;
int n, m;//n为行数,m为列数
//dx和dy是偏移量数组
int dx[] = {
-2, -2, 2, 2, -1, -1, 1,