深度优先搜索法实例一 模拟导航软件线路规划

使用二维数组模拟地图信息,a[i][j]==0表示i==j即同一地点,a[i][j]==-1表示i无法到达j(但是j可能可以到达j),a[i][j]==n(n>0)表示从i到j行驶的路程为n,利用深度优先搜索法找出一条条线路,再挑选出最短的那条

#include<iostream>
using namespace std;
int min = 999999;//初始置为一个较大的数
int deration[20] = { 0 };//用于储存线路信息
int t = 0;//线路中途径的城市数
void dfs(int a[20][20], int book[50], int n, int cur, int end,int distence)//a数组用于储存地图信息,book数组用于储存已访问过的城市,n表示地图信息中城市的数目,cur表示当前到达的城市,end表示终点,distance表示从起点到当前点的路程
{
    if (cur == end)//到达目的点则输出线路,寻找最短路程
    {
        cout << "线路:";
        for (int i = 0; i < t-1; i++)
            cout << deration[i] << "->";
        cout << deration[t - 1];
        cout << "  路程:" << distence << endl;
        if (distence < min)
            min = distence;
    }
    else
    {
        for (int i = 1; i <= n; i++)//寻找cur当前点可到达且未访问过的点
        {
            if (a[cur][i] != 0 && a[cur][i] != -1 && book[i] == 0)//能到达、没有访问过
            {
                book[i] = 1;//将即将访问的点置为已访问
                deration[t++] = i;//将线路信息储存
                dfs(a, book, n, i, end, distence + a[cur][i]);//递归调用,访问下一个城市,distence + a[cur][i]表示路程增加cur到i的路程
                book[i] = 0;//回溯时将i城市重置为未访问
                deration[--t] = 0;//回溯时将i城市从线路中删除
            }
        }
    }
}
int main()
{
    int a[20][20], book[50] = { 0 }, n, m, t1, t2, t3, begin, end;//a数组用于储存地图信息,book数组用于储存已访问过的城市,n表示地图信息中城市的数目,begin表示起点,end表示终点
    //t1,t2,t3用于输入公路信息,t1表示路的起点,t2表示路的终点,t3表示这条路的长度
    for (int i = 0; i < 20; i++)
    {
        for (int j = 0; j < 20; j++)
        {
            if (i == j)//自己到自己的距离为零
                a[i][j] = 0;
            else//初始置为无法到达
                a[i][j] = -1;
        }
    }
    cout << "请输入地图中城市的个数:";
    cin >> n;
    cout << "请输入公路的条数:";
    cin >> m;
    cout << "请依次输入公路信息(格式:x y z表示x到y的公路,长度为z):" << endl;
    for (int i = 0; i < m; i++)
    {
        cout << "请输入第 " << i + 1 << " 条:";
        cin >> t1 >> t2 >> t3;
        a[t1][t2] = t3;
    }
    cout << "请输入起点的位置:";
    cin >> begin;
    while (begin<1 || begin>n)//防止非法输入
    {
        cout << "输入的位置不在地图信息内!";
        cout << "请重新输入起点的位置:";
        cin >> begin;
    }
    cout << "请输入终点的位置:";
    cin >> end;
    while (end<1 || end>n)//防止非法输入
    {
        cout << "输入的位置不在地图信息内!";
        cout << "请重新输入终点的位置:";
        cin >> end;
    }
    book[begin] = 1;//初始赋值
    deration[t++] = begin;//线路初始化
    dfs(a, book, n, begin, end, 0);//开始寻找
    cout << "最短的距离为:" << min << endl;
    return 0;
}

简单示例及结果:
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/81590361