标签:
/* POJ 3984 迷宫问题 --- BFS */ #include <cstdio> int mapn[5][5]; int x[100], y[100], pre[100]; int front = 0;//队首 int rear = 1;//队尾指向首元素的后一位 int dx[4] = { 1, -1, 0, 0 }; //4个方向 int dy[4] = { 0, 0, 1, -1 }; void printmap(int i){ //注意pre[0]的值为-1,所以(0,0)没有输出 if (pre[i] != -1){ printmap(pre[i]); printf("(%d, %d)\n", x[i], y[i]); } } void bfs(int x0, int y0){ x[front] = x0; y[front] = y0; pre[front] = -1; //首元素(即左上角元素)入队 while (front < rear){ //队不为空时 for (int i = 0; i < 4; ++i){ //往四个方向广搜,判断是否可以访问 int a = x[front] + dx[i]; int b = y[front] + dy[i]; if (a < 0 || a > 4 || b < 0 || b > 4 || mapn[a][b] == 1) continue; //无法访问的点 else{ mapn[a][b] = 1; //第一次访问就是最短的,访问后标记访问过(直接改为1可以省去一个visit数组) //满足的元素入队 x[rear] = a; y[rear] = b; pre[rear] = front; //记录路径(最短路常用) ++rear; if (a == 4 && b == 4) printmap(front); //(4,4)所在的点的下标此时并未入队,故(4,4)也未输出 } }//for(i); ++front; //一访问过的元素出队 } } int main() { for (int i = 0; i < 5; ++i){ for (int j = 0; j < 5; ++j){ scanf("%d", mapn[i] + j); }//for(j) }//for(i) printf("(0, 0)\n"); bfs(0, 0); printf("(4, 4)\n"); return 0; }
标签:
原文地址:http://www.cnblogs.com/tommychok/p/5056679.html