【题目描述】
一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n×n的格点组成,每个格点只有2种状态,
.
和#
,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#
),则看成无法办到。【输入】
第1行是测试数据的组数k,后面跟着k组输入。每组测试数据的第1行是一个正整数n(1≤n≤100),表示迷宫的规模是n×n的。接下来是一个n×n的矩阵,矩阵中的元素为
.
或者#
。再接下来一行是44个整数ha,la,hb,lb,描述A处在第ha行, 第la列,B处在第hb行, 第lb列。注意到ha,la,hb,lb全部是从0开始计数的。【输出】
k行,每行输出对应一个输入。能办到则输出“YES”,否则输出“NO”。
【输入样例】
2 3 .## ..# #.. 0 0 2 2 5 ..... ###.# ..#.. ###.. ...#. 0 0 4 0【输出样例】
YES NO#include<stdio.h> #include<string.h> #include<queue> int m; char c[100][100]; int xa, ya, xb, yb; bool vis[100][100]; int dir[][2] = { {1,0},{-1,0},{0,1},{0,-1} }; struct node { int x; int y; int step; }q[10000]; void bfs(int xa, int ya, int xb, int yb) { int head = 1, tail = 1; memset(vis, 0, sizeof(vis)); q[tail].x = xa; q[tail].y = ya; q[tail].step = 0; tail++; vis[xa][ya] = 1; int flag = 1; while (head < tail) { int x = q[head].x; int y = q[head].y; int step = q[head].step; if (x == xb && y == yb) { flag = 0; printf("YES\n"); break; } for (int i = 0; i < 4; i++) { int nx = x + dir[i][0]; int ny = y + dir[i][1]; if (nx >= 0 && nx < m && ny >= 0 && ny < m && c[nx][ny] == '.' && vis[nx][ny] == 0) { vis[nx][ny] = 1; q[tail].x = nx; q[tail].y = ny; q[tail].step = step + 1; tail++; } } head++; } if (flag == 1) { printf("NO\n"); } } int main() { int n; scanf("%d", &n); while (n--) { scanf("%d", &m); for (int i = 0; i < m; i++) { scanf("%s", c[i]); } scanf("%d%d%d%d", &xa, &ya, &xb, &yb); bfs(xa, ya, xb, yb); } return 0; }
相关文章
- 11-08一本通1630SuperGCD
- 11-08一本通 1280:【例9.24】滑雪
- 11-08一本通 1011:甲流疫情死亡率
- 11-08一本通提高篇之一句话系列
- 11-08一本通1599【 例 3】修剪草坪
- 11-08一本通1593【例 2】牧场的安排
- 11-08一本通提高篇
- 11-08一本通1548【例 2】A Simple Problem with Integers
- 11-081023:Hello,World!的大小-信息学一本通(c++)
- 11-08一本通 1475:L语言