走迷宫

来源:互联网 发布:经典的破案电视剧 知乎 编辑:程序博客网 时间:2024/05/01 17:52

从起点到终点的最短移动序列,每次只能往上、下、左、右移动到相邻的单元格。任何时候都不能在阻碍格中,也不能走出迷宫之外,此题跟POJ3278有些相似,都是用了BFS

/* *此题的二维迷宫是从上到下,从左到右一次编号的 * 0 3 6 * 1 4 7 * 2 5 8 * 这就是3X3的编号 * */#include<cstdio>#include<cstring>#define MAXN 110int dx[4]={-1,1,0,0};int dy[4]={0,0,-1,1};int n,m;int vis[MAXN][MAXN],maze[MAXN][MAXN];/*存储当前结点的父结点   起点到当前结点的距离  最后一步移动方向*/int fa[MAXN][MAXN],dist[MAXN][MAXN], last_dir[MAXN][MAXN];//临时队列int q[MAXN*MAXN];void bfs(int x, int y){int front=0, rear=0, d, u;u=x*m+y;vis[x][y] =1;fa[x][y] = u;//初始化起点,起点没有父结点,保存的是自身dist[x][y] = 0;q[rear++] =u;while(front < rear){u = q[front++];x =u/m; y=u%m;for(d =0; d< 4; d++){int nx =x+dx[d], ny = y+dy[d];if(nx>=0 && nx < n && ny>=0 && ny<m && maze[nx][ny] && !vis[nx][ny]){int v = nx*m+ny;q[rear++] = v;vis[nx][ny] = 1;fa[nx][ny] = u;dist[nx][ny] = dist[x][y] +1;last_dir[nx][ny] = d;}}}}int dir[MAXN*MAXN];void print_path(int x, int y){char name[5]={"UDLR"};int c=0;for(;;){int fx = fa[x][y]/m;int fy = fa[x][y]%m;if( fx == x && fy == y)break;dir[c++] = last_dir[x][y];x = fx;y = fy;}while(c--)putchar(name[dir[c]]);putchar('\n');}int main(){while(scanf("%d%d",&n, &m) != EOF){memset(vis, 0, sizeof(vis));for(int i=0; i<n; i++){char s[MAXN];scanf("%s",s);for(int j=0; j<m; j++)maze[i][j] = s[j] - '0';}int x,y;scanf("%d%d", &x, &y);bfs(x,y);scanf("%d%d", &x, &y);print_path(x,y);}return 0;}


0 0
原创粉丝点击