HDU 1728 逃离迷宫 BFS(加转弯数)
来源:互联网 发布:淘宝网男士长袖衬衣 编辑:程序博客网 时间:2024/05/17 02:06
#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>#include <queue>#include <math.h>using namespace std ;#define INF 0xfffffffstruct Node{ int x ; int y ; int turn ; //记录转弯处 int dir ; //记录方向,分别为0, 1, 2, 3}n, m ;char map[105][105] ;bool flag ;int num[105][105] ; /* num[105][105]记录在(x, y)处转过的弯处*/int tcase, r, c ;int K, sx, sy, dx, dy ; //转弯最大处,起始坐标int direct[4][2] = {1, 0, 0, -1, -1, 0, 0, 1} ;int main(){ int i, j, k ; cin >> tcase ; while (tcase --) { cin >> r >> c ; for (i = 1; i <= r; i ++) for (j = 1; j <= c; j ++) cin >> map[i][j] ; scanf ("%d%d%d%d%d", &K, &sy, &sx, &dy, &dx) ; for (i = 0; i < 105; i ++) for (j = 0; j < 105; j ++) num[i][j] = INF ; flag = false ; num[sx][sy] = -1 ; /*初始化在原点的转弯次为0*/ queue <Node> Q ; for (i = 0; i < 4; i ++) /*初始化从起点到四个方向的状态,进入队列,*/ { /*起始点到四个方向,转过的弯都为0*/ n.x = sx + direct[i][0] ; n.y = sy + direct[i][1] ; n.turn = 0 ; //初始化原点到相邻四个方向的转弯次为0 n.dir = i ; if (n.x > 0 && n.y > 0 && n.x <= r && n.y <= c && map[n.x][n.y] == '.') { num[n.x][n.y] = 0 ; //初始化原点到相邻四个方向的转弯次为0 Q.push (n) ; } } while (! Q.empty ()) // 遍历 { m = Q.front () ; Q.pop () ; for (i = 0; i < 4; i ++) { n.x = m.x + direct[i][0] ; n.y = m.y + direct[i][1] ; n.turn = m.turn ; if (m.dir != i) //出队列所在的方向与当前方向不同 { //当前方向为新方向 n.dir = i ; //当前坐标的转弯数+1 n.turn = m.turn + 1 ; } else { n.dir = m.dir ; } if (n.x > 0 && n.y > 0 && n.x <= r && n.y <= c && map[n.x][n.y] == '.' && n.turn <= K) { if (num[n.x][n.y] < n.turn) //相等的情况,这时候方向可能不同,所以不能剪枝 continue ; num[n.x][n.y] = n.turn ; /*否则赋值新的转弯处(注意,起始的转弯数为INF)*/ Q.push (n) ; } } } if (num[dx][dy] <= K) /* 如果到达过该处,转弯数肯定为某值,否则,该转弯数肯定为INF,即到达不了*/ printf ("yes\n") ; else printf ("no\n") ; } return 0 ;}