关于#c++#的问题,请各位专家解答!


#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!"。

你是报错了还是