POJ 3083 Children of the Candy Corn
明天写
前言
许久没有写博客了,因为要考研大部分的时间都用来学数学英语了。然后机缘巧合下找到了份还行的实习,所以又开始学算法数据结构了,那就写写题解记录一下。
正文
这是这几天做到两道理解比较深刻的水题(其实也没那么水吧)其中之一。花了比较多的时间,然后在网上看了不少题解,感觉都有点不清晰,所以这边记录一下同时谈谈自己的理解。(昨天写了个标题今天就有三十的阅读,一定认真写这篇)
原题
题干太长就不贴了,直接点这里去POJ或者VJ上看原题。
样例这里贴一下:
Sample Input:
2
8 8
########
#......#
#.####.#
#.####.#
#.####.#
#.####.#
#...#..#
#S#E####
9 5
#########
#.#.#.#.#
S.......E
#.#.#.#.#
#########
Sample Output:
37 5 5
17 17 9
这边再给两个样例:
2
3 3
###
S.#
#E#
5 10
#####
#...E
#..#.
#..#.
#..#.
#...#
#....
#.##.
#S#..
#####
//output:
//3 3 3
//11 21 11
题解
这题的意思是说给你一个起点和终点,’#‘是墙,’.'是路。要求三种路径的长度,一种是左转优先,一种是右转优先,最后是最短路径。
思路:这题刚看思路应该是很清晰的,左右优先的用DFS,最短路径用BFS,事实上也确实如此。但是在一些细节方面如果处理不好的也比较麻烦(比如我交了十四次才AC)。
讲几个难到我的点:开始我是想用一个包含参数mode的表达式来控制左右优先,后来试了很久,发现这不是我可以攻克的难题,于是就退一步用了个if。然后在广搜的时候怎么记录步长又难倒我了,后来看了网上的题解才想起来可以在结构体里记录,很菜。其他好像也没什么难点了,果然菜是原罪。
直接上code,我注释写的还算详细,觉得不错的话点个赞呗,如果有什么地方不清楚的话请私信我,欢迎交流。
Code
// POJ3083 Children of the Candy Corn.cpp
#include <iostream>
#include <queue>
using namespace std;
struct Position
{
int x, y, dep; // x记录的是第几列,y记录的是第几行。这个得注意下。