【题目含义】若干次询问,每次有一个 m×nm\times nm×n 的地图,上面每个格子若为 000 则说明是可走的路,若不为 000 则是小羊的家,如 111 表示是 111 号羊的家。后面有一个整数 qqq ,表示 qqq 次询问,每次给定 444 个数 a1a1a1 b1b1b1 a2a2a2 b2b2b2,询问在 (a1,b1)(a1,b1)(a1,b1) 的羊能否在拐第三个弯之前回到 (a2,b2)(a2,b2)(a2,b2) 的家,可以输出 YESYESYES ,否则输出 NONONO 。
【思路】最少转弯问题。首先先输入数据,判断起点处 AAA 和终点处 BBB 是否满足 A=B≠0A=B\neq0A=B=0,如果不满足说明不可能完成,直接输出 NONONO ,否则进行广搜 BFSBFSBFS 判断是否可行,可以输出 YESYESYES ,否则输出 NONONO 。
这里针对 BFSBFSBFS 有个思路:
* 首先不要看到题目慌张,经过读题易知这道题目要对一个二维数组进行搜索,故先开好结构体 struct node\red{struct}\,\,\blue{node}structnode ,里面成员有 xxx 和 yyy 坐标,以及最少拐弯次数。
* 接着就是 BFSBFSBFS 过程的代码了。由于最少拐弯问题,如果一格一格搜索还要判断刚刚过来的方向与现在方向符不符合,太麻烦。不如,你直接往这个方向全部搜完都放入队列(比如 (4,2)(4,2)(4,2) (4,3)(4,3)(4,3) (4,4)(4,4)(4,4) 这些格子在同一行或同一列,且都可以让小羊走,就一次性全加入队列, turns\orange{turns}turns 拐弯次数 +1+1+1 即可)。
* 然后,就到了 BFSBFSBFS 队列第一个元素的赋值语句了。这里由于每次拐弯次数都要 +1+1+1 ,但如果一开始沿着直线走的话次数宜为 000 ,反推得到初始时赋值应当将 turns\orange{turns}turns 结构体成员值赋值为 −1-1−1 。
* 最后,如果成员 turns≤2\orange{turns} \leq 2turns≤2 则判断是否需要继续 BFSBFSBFS ,否则直接不加入队列(注意还不能 return 0;\red{return}\,\,0;return0; );当队列中已经没有元素时才能够 return 0;\red{return}\,\,0;return0; 。
ACACAC 代码