链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728
之前没有做过类似这种要最少拐弯数的题目,一般求最少的用bfs应该比较好。。但是之前bfs一般都是用来求最小步数,也就可以标记过走过的点不再走。现在本题要的是最小的拐弯数,所以不能标记走过的点。。需要一个数组来记录当前这个点所需要的最小拐弯数,如果此时这个点的拐弯数比之前该点的拐弯数还小或者等于就更新这个值。遍历全图直到找到解为止。
学习:对于bfs找最优解的变形。明白如何更新拐弯数的,保证最小。
背景:1、WA对于保存拐弯数的数组没有初始化为无穷。2、MLE 对于每个点要进行拐弯数的判定,只有比之前保存的值还小或者等与才入队,否则队列会爆。。3、AC后还进行了一个剪枝,但是忘了将队列中的元素弹出。结果死循环。。。 下次注意最好将队列的头元素取出之后就弹出,避免忘记。。。
判定转弯数的时候一定要是等于号。。这是别人的题解http://972169909-qq-com.iteye.com/blog/1244218 看了图就明白了。。
代码:
//hdu 1728
#include<cstdio>
#include<cstring>
#include<queue>
#define INF 10000000;
using namespace std;
int d1[4] = {0,0,1,-1};
int d2[4] = {1,-1,0,0};
int turn1[101][101];
char map[101][101];
int n,m,k;
int ok;
int sx,sy,ex,ey;
struct state
{
int x,y;
int turn;
int dir;
}cur,next1;
void bfs(sta