在N*N的迷宫内,“#”为墙,“.”为路,“s”为起点,“e”为终点,一共4个方向可以走。从左上角((0,0)“s”)位置处走到右下角((n-1,n-1)“e”)位置处,可以走通则输出YES,不可以走则输出NO。
输入的第一行为一个整数m,表示迷宫的数量。
其后每个迷宫数据的第一行为一个整数n(n≤16),表示迷宫的边长,接下来的n行每行n个字符,字符之间没有空格分隔。
输出有m行,每行对应的迷宫能走,则输出YES,否则输出NO。
1
7
s...##.
.#.....
.......
..#....
..#...#
###...#
......e
YES
#include<stdio.h> #include<string.h> #define N 25 char map[N][N]; bool visited[N][N][5]; int n, flag; //i,j代表坐标,d代表方向 void dfs(int i, int j, int d){ if (flag == 1 || visited[i][j][d]) return; if (map[i][j] == 'e'){ flag = 1; printf("YES\n"); } visited[i][j][d] = 1; //如果当前位置不是前一个位置向下走, 则可以向上走 if (d != 2 && map[i - 1][j] != '#' && i - 1 >= 0) dfs(i - 1, j, 1); if (d != 1 && map[i + 1][j] != '#' && i + 1 < n) dfs(i + 1, j, 2); if (d != 4 && map[i][j - 1] != '#' && j - 1 >= 0) dfs(i, j - 1, 3); if (d != 3 && map[i][j + 1] != '#' && j + 1 < n) dfs(i, j + 1, 4); } int main(){ int m; scanf("%d", &m); while (m--){ flag = 0; memset(visited, 0, sizeof(visited)); scanf("%d", &n); int i; for (i = 0; i < n; i++) scanf("%s", map[i]); dfs(0, 0, 0); if (flag == 0) printf("NO\n"); } return 0; }
#include<stdio.h> #include<string.h> #define N 25 char map[N][N]; bool visited[N][N]; struct Node{ int x, y; }; struct Queue{ Node a[10000]; int head, rear; Queue(){ head = 0; rear = 0; } void push(int i, int j){ a[rear].x = i; a[rear++].y = j; } void pop(Node *b){ b->x = a[head].x; b->y = a[head].y; head++; } bool isEmpty(){ return head >= rear; } }q; int main(){ int m, n; scanf("%d", &m); while (m--){ int flag = 0; memset(visited, 0, sizeof(visited)); scanf("%d", &n); int i; for (i = 0; i < n; i++) scanf("%s", map[i]); visited[0][0] = 1; q.push(0, 0); while (!q.isEmpty()){ Node b; q.pop(&b); //如果当前位置下面的点可以走 if (!visited[b.x + 1][b.y] && map[b.x + 1][b.y] != '#' && b.x + 1 < n){ if (map[b.x + 1][b.y] == 'e'){ flag = 1; break; } visited[b.x + 1][b.y] = 1; q.push(b.x + 1, b.y); } //如果当前位置上面的点可以走 if (!visited[b.x - 1][b.y] && map[b.x - 1][b.y] != '#' && b.x - 1 >= 0){ if (map[b.x - 1][b.y] == 'e'){ flag = 1; break; } visited[b.x - 1][b.y] = 1; q.push(b.x - 1, b.y); } //如果当前位置右面的点可以走 if (!visited[b.x][b.y + 1] && map[b.x][b.y + 1] != '#' && b.y + 1 < n){ if (map[b.x][b.y + 1] == 'e'){ flag = 1; break; } visited[b.x][b.y + 1] = 1; q.push(b.x, b.y + 1); } //如果当前位置左面的点可以走 if (!visited[b.x][b.y - 1] && map[b.x][b.y - 1] != '#' && b.y - 1 >= 0){ if (map[b.x][b.y - 1] == 'e'){ flag = 1; break; } visited[b.x][b.y - 1] = 1; q.push(b.x, b.y - 1); } } if (flag == 0) printf("NO\n"); else printf("YES\n"); } return 0; }
原文地址:http://blog.csdn.net/u013174702/article/details/44263557