罗密欧与朱丽叶的迷宫问题_dfs
2014-03-19 16:10
197 查看
罗密欧与朱丽叶的迷宫问题 问题描述: 罗密欧与朱丽叶的迷宫。罗密欧与朱丽叶身处一个m×n的迷宫中,如图所示。每一个方格表示迷宫中的一个房间。这m×n个房间中有一些房间是封闭的,不允许任何人进入。在迷宫中任何位置均可沿8 个方向进入未封闭的房间。罗密欧位于迷宫的(p,q)方格中,他必须找出一条通向朱丽叶所在的(r,s)方格的路。在抵达朱丽叶之前,他必须走遍所有未封闭的房间各一次,而且要使到达朱丽叶的转弯次数为最少。每改变一次前进方向算作转弯一次。请设计一个算法帮助罗密欧找出这样一条道路。 罗密欧与朱丽叶的迷宫 .编程任务: 对于给定的罗密欧与朱丽叶的迷宫,编程计算罗密欧通向朱丽叶的所有最少转弯道路。 .数据输入: 由文件input.txt给出输入数据。第一行有3个正整数n,m,k,分别表示迷宫的行数,列数和封闭的房间数。接下来的k行中,每行2 个正整数,表示被封闭的房间所在的行号和列号。最后的2 行,每行也有2 个正整数,分别表示罗密欧所处的方格(p,q)和朱丽叶所处的方格(r,s)。 .结果输出: 将计算出的罗密欧通向朱丽叶的最少转弯次数和有多少条不同的最少转弯道路输出到文件output.txt。文件的第一行是最少转弯次数。文件的第2 行是不同的最少转弯道路数。接下来的n行每行m个数,表示迷宫的一条最少转弯道路。A[i][j]=k表示第k步到达方格(i,j);A[i][j]=-1 表示方格(i,j)是封闭的。 如果罗密欧无法通向朱丽叶则输出“No Solution!”。 输入文件示例 input.txt 3 4 2 1 2 3 4 1 1 2 2 输出文件示例 output.txt 6
#include <iostream>#include <cstdio>#include <cstring>#define INF 0x3f3f3f3fusing namespace std;int dx[] = {1, 1, 0, -1, -1, -1, 0, 1};int dy[] = {0, 1, 1, 1, 0, -1, -1, -1};int map[15][15];bool visit[15][15];int n, m;int st_x, st_y, end_x, end_y;int mmin = INF, sum, f = 0;void dfs(int x, int y, int con, int st, int dir){//printf("%d %d %d %d %d\n", x, y, con, st, dir);//getchar();if (st == sum && x == end_x && y == end_y){f = 1;if (mmin > con)mmin = con;return ;}if (st != sum && x == end_x && y == end_y)return ;if (con >= mmin)return ;for (int i = 0; i < 8; i++){int k = x + dx[i];int l = y + dy[i];if (k >= 1 && l >= 1 && k <= n && l <= m && !visit[k][l] && map[k][l] == 0){visit[k][l] = 1;if (dir == i)dfs(k, l, con, st + 1, i);elsedfs(k, l ,con + 1, st + 1, i);visit[k][l] = 0;}}}int main(){int t;scanf("%d%d%d", &n, &m, &t);sum = n * m - t - 1;int i, j;for(i = 0; i < t; i++){int a, b;scanf("%d%d", &a, &b);map[a][b] = INF;}scanf("%d%d%d%d", &st_x, &st_y, &end_x, &end_y);for (i = 0; i < 8; i++){memset(visit, 0, sizeof (visit));visit[st_x][st_y] = 1;int k = st_x + dx[i];int l = st_y + dy[i];if (k >= 1 && l >= 1 && k <= n && l <= m && !visit[k][l] && map[k][l] == 0){visit[k][l] = 1;dfs(k, l, 0, 1, i);visit[k][l] = 0;}}if (!f)printf("No Solution!\n");elseprintf("%d\n", mmin);return 0;}
相关文章推荐
- 迷宫问题[1] DFS 不保证最短路径
- POJ - 1164 The Castle(图论/DFS 迷宫问题)
- DFS之最简单的迷宫问题
- 经典迷宫问题DFS
- 迷宫问题---深度搜索(dfs)
- 迷宫问题(DFS,BFS)
- poj 迷宫问题(路径记录)(DFS,BFS)
- 迷宫问题(第一次DFS搜索)
- SDUT1157:小鼠迷宫问题(bfs+dfs)
- 【数据结构】迷宫问题求解(链栈,DFS)
- 深度优先搜索(DFS)求解迷宫问题
- poj 迷宫问题(路径记录)(DFS,BFS)
- 迷宫问题(DFS)
- FZU 1205(小鼠迷宫问题)BFS+DFS的基本综合运用(同一题目中体现两种搜索方法的特点)
- 7084:迷宫问题(dfs)
- POJ 3984 迷宫问题 (DFS(深度优先搜索))
- BFS和DFS方法解决走迷宫问题
- PAT甲级1003---迷宫问题(DFS或Dijkstra)
- poj 迷宫问题(路径记录)(DFS,BFS)
- POJ 3984 迷宫问题(BFS or DFS)