罗密欧与朱丽叶的迷宫问题
问题描述:
罗密欧与朱丽叶的迷宫。罗密欧与朱丽叶身处一个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 0x3f3f3f3f
using 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);
else
dfs(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");
else
printf("%d\n", mmin);
return 0;
}