九度OJ 1335:闯迷宫 (BFS)
- 题目描述:
-
sun所在学校每年都要举行电脑节,今年电脑节有一个新的趣味比赛项目叫做闯迷宫。
sun的室友在帮电脑节设计迷宫,所以室友就请sun帮忙计算下走出迷宫的最少步数。
知道了最少步数就可以辅助控制比赛难度以及去掉一些没有路径到达终点的map。
比赛规则是:从原点(0,0)开始走到终点(n-1,n-1),只能上下左右4个方向走,只能在给定的矩阵里走。
- 输入:
-
输入有多组数据。
每组数据输入n(0<n<=100),然后输入n*n的01矩阵,0代表该格子没有障碍,为1表示有障碍物。
注意:如果输入中的原点和终点为1则这个迷宫是不可达的。
- 输出:
-
对每组输入输出该迷宫的最短步数,若不能到达则输出-1。
- 样例输入:
-
2 0 1 0 0 5 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0
- 样例输出:
-
2 8
思路:
求迷宫最少步数自然用BFS。
代码:
#include <stdio.h> #include <limits.h> #define N 100 #define INF (INT_MAX/2) typedef struct node { int x; int y; int s; int v; int d; } Point; int n; Point p[N][N]; Point *queue[N*N+1]; int front, rear; void initQueue() { front = rear = 0; } int isEmpty() { return front == rear; } void push(Point *p1) { queue[rear++] = p1; } Point *pop() { return queue[front++]; } void init() { int i, j; initQueue(); for (i=0; i<n; i++) { for (j=0; j<n; j++) { scanf("%d", &(p[i][j].s)); p[i][j].x = i; p[i][j].y = j; p[i][j].d = INF; p[i][j].v = p[i][j].s; } } } int legal(int x, int y) { return x>=0 && x<n && y>=0 && y<n; } void BFS(Point *begin, Point *end) { int i; begin->v = 1; begin->d = 0; push(begin); int t[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; while (!isEmpty()) { Point *p1 = pop(); for (i=0; i<4; i++) { int nx = p1->x + t[i][0]; int ny = p1->y + t[i][1]; if (legal(nx, ny) && !p[nx][ny].v) { Point *np = &p[nx][ny]; np->v = 1; np->d = p1->d + 1; if (np == end) return ; push(np); } } } } int main() { Point *begin, *end; while(scanf("%d", &n) != EOF) { init(); begin = &p[0][0]; end = &p[n-1][n-1]; if (begin->s == 1 || end->s == 1) { printf("-1\n"); continue; } BFS(begin, end); if (end->d == INF) printf("-1\n"); else printf("%d\n", end->d); } return 0; } /************************************************************** Problem: 1335 User: liangrx06 Language: C Result: Accepted Time:100 ms Memory:1188 kb ****************************************************************/
编程算法爱好者。