#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
int dx[] = { 1,0,-1,0};
int dy[] = { 0,1,0,-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)
{
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 < 4; 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;
cin >> n >> m >> t;
sum = n * m - t - 1;
int i, j;
for (i = 0; i < t; i++)
{
int a, b;
cin >> a >> b;
map[a][b] = INF;
}
cin >> st_x >> st_y >> end_x >> end_y;
for (i = 0; i < 4; i++)
{
memset(visit, 0, sizeof(visit));
visit[st_x][st_y] = true;
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)
cout<<"No Solution!";
else
cout << "最短路径长度";
cout << mmin;
return 0;
}
罗密欧朱丽叶迷宫有什么问题吗请问
还是有些问题的
1 dfs函数的参数con表示当前路径长度,但是在搜索不同方向的分支时,con的值并没有加1,这会导致搜索结果的路径长度不正确。例如,从起点向右走1步,向下走1步到达终点,程序会认为路径长度是1而不是2。
2 程序在找到第一条到达终点的路径后就停止搜索并输出结果。但是这条路径并不一定是最短路径,继续搜索可能会找到更短的路径。所以,程序需要继续搜索所有可能的路径,并在搜索结束后输出最短路径长度。
3 程序在搜索每条路径时,都从起点开始。这会导致同一个格子被重复搜索很多次,降低效率。改进的方法是使用visit数组记录已访问的格子,避免重复搜索。
4 由于使用了visit数组记录已访问格子,所以在搜索不同分支时需要重置visit数组,否则会影响其他分支的搜索。但是程序只在开始搜索每个方向前重置一次visit数组,这会导致第一个分支的visit记录影响其他分支的搜索,产生错误结果。需要在搜索每个分支前重置visit数组。
你的代码是一个寻找最短路径的算法,使用深度优先搜索(DFS)实现。它通过递归地探索可能的路径,并记录最短路径的长度。
然而,你的代码中有几个问题需要修正:
1、map 是C++中的关键字,不能用作变量名。你可以使用其他名称来代替。
2、你使用了宏定义 INF 来表示无穷大的值,但在代码中使用 map[a][b] = INF; 将其赋给数组元素是错误的。应该将障碍物或不可达位置设置为一个较大的值,而不是无穷大。
3、在 cout << "最短路径长度"; 之前,应该先输出换行符,以便在结果中正确显示。
以下是修正后的代码:
#include <iostream>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
int dx[] = { 1, 0, -1, 0 };
int dy[] = { 0, 1, 0, -1 };
int grid[15][15];
bool visit[15][15];
int n, m;
int start_x, start_y, end_x, end_y;
int min_length = INF, sum, f = 0;
void dfs(int x, int y, int con, int st, int dir)
{
if (st == sum && x == end_x && y == end_y)
{
f = 1;
if (min_length > con)
min_length = con;
return;
}
if (st != sum && x == end_x && y == end_y)
return;
if (con >= min_length)
return;
for (int i = 0; i < 4; i++)
{
int k = x + dx[i];
int l = y + dy[i];
if (k >= 1 && l >= 1 && k <= n && l <= m && !visit[k][l] && grid[k][l] == 0)
{
visit[k][l] = true;
if (dir == i)
dfs(k, l, con, st + 1, i);
else
dfs(k, l, con + 1, st + 1, i);
visit[k][l] = false;
}
}
}
int main()
{
int t;
cin >> n >> m >> t;
sum = n * m - t - 1;
memset(grid, 0, sizeof(grid));
memset(visit, false, sizeof(visit));
for (int i = 0; i < t; i++)
{
int a, b;
cin >> a >> b;
grid[a][b] = INF; // 将障碍物或不可达位置设置为一个较大的值
}
cin >> start_x >> start_y >> end_x >> end_y;
for (int i = 0; i < 4; i++)
{
memset(visit, false, sizeof(visit));
visit[start_x][start_y] = true;
int k = start_x + dx[i];
int l = start_y + dy[i];
if (k >= 1 && l >= 1 && k <= n && l <= m && !visit[k][l] && grid[k][l] == 0)
{
visit[k][l] = true;
dfs(k, l, 0, 1, i);
visit[k][l] = false;
}
}
if (!f)
cout << "No Solution!";
else
{
cout << "最短路径长度: " << min_length << endl;
}
return 0;
}
请确保按照题目要求正确输入地图的大小、障碍物的数量以及起点和终点的坐标。修正后的代码将输出最短路径的长度。如果没有可行的路径,将输出"No Solution!"。
你是报错了还是
缺省参数是声明或者定义函数时为函数参数指定的一个默认值(默认参数)。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定实参。
void Func(int a = 0)
{
cout << a << endl;
}
int main()
{
Func(); // 没有传参时,使用参数的默认值
Func(1);
//你若安好,备胎到老
return 0;
}
0
1
请按任意键继续. . .
没有传参时,使用参数的默认值。