POJ 3984

来源:互联网 发布:道亨软件多少钱 编辑:程序博客网 时间:2024/06/15 07:57

题目大意:中文题。。。定义一个二维数组: 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

解题思路:建立一个模拟队列的结构体,其中包括x,y,pre。pre用于存储前一步的位置(结构体数组的位)。全局变量,标记数组,头尾位置。bfs先将起点读入,pre为-1。然后循环将起点上下左右判断是否能移动,能移动存入结构体,pre为这一次读入的位置的的数组位置(未出列时的头)。当移动后的位置为终点时退出。输出时dfs,如果pre未=-1,表示没到起点,进入下一层,直到到起点,输出,回上一层输出。

ac代码:

#include <iostream>using namespace std;struct node{int x;int y;int pre;}no[50];int dx[4]={-1, 1, 0, 0}, dy[4]={0, 0, -1, 1};int front, rear, a[5][5], vis[5][5];void bfs(){int temp1, temp2, X, Y;front = rear = 0;for (int i=0; i<5; i++)for (int j=0; j<5; j++){vis[i][j] = 0;if (a[i][j])vis[i][j] = 1;}no[0].x = no[0].y = 0;no[0].pre = -1;rear++;while (front < rear){temp1 = no[front].x, temp2 = no[front].y;if (temp1 == 4 && temp2 == 4)return ;front++;for (int i=0; i<4; i++){X = temp1 + dx[i];Y = temp2 + dy[i];if (X >= 0 && X < 5 && Y >= 0 && Y < 5 && !vis[X][Y]){no[front].x = X, no[front].y = Y, no[front].pre = front-1;vis[X][Y] = 1;rear++;}}}}void prin(node n){if (n.pre == -1)printf("(%d, %d)\n", n.x, n.y);else{prin(no[n.pre]);printf("(%d, %d)\n", n.x, n.y);}}int main(){while (scanf("%d", &a[0][0])!=EOF){for (int i=0; i<5; i++)for (int j=0; j<5; j++)if (i || j)scanf("%d", &a[i][j]);bfs();prin(no[front]);}return 0;}
原创粉丝点击