在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