南陽理工課程設計-校園導航

 

 

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+5;
typedef long long LL;
const LL INF = 0x3f3f3f3f;
map<int,string>A;
struct Edge
{
    int from, to; LL dist;       //起點,終點,距離
    Edge(int from, int to, LL dist):from(from), to(to), dist(dist) {}
};
 
struct Dijkstra
{
    int n, m;                 //結點數,邊數(包括反向弧)
    vector<Edge> edges;       //邊表。edges[e]和edges[e^1]互爲反向弧
    vector<int> G[MAXN];      //鄰接表,G[i][j]表示結點i的第j條邊在edges數組中的序號
    int vis[MAXN];            //標記數組
    LL d[MAXN];              //s到各個點的最短路
    int p[MAXN];              //上一條弧
 
    void init(int n)
    {
        this->n = n;
        edges.clear();
        for (int i = 0; i <= n; i++) G[i].clear();
    }
 
    void AddEdge(int from, int to, int dist)
    {
        edges.push_back(Edge(from, to, dist));
        m = edges.size();
        G[from].push_back(m - 1);
    }
 
    struct HeapNode
    {
        int from; LL dist;
        bool operator < (const HeapNode& rhs) const
        {
            return rhs.dist < dist;
        }
        HeapNode(int u, LL w): from(u), dist(w) {}
    };
 
    void dijkstra(int s)
    {
        priority_queue<HeapNode> Q;
        for (int i = 0; i <= n; i++) d[i] = INF;
        memset(vis, 0, sizeof(vis));
        d[s] = 0;
        Q.push(HeapNode(s, 0));
        while (!Q.empty())
        {
            HeapNode x = Q.top(); Q.pop();
            int u = x.from;
            if (vis[u]) continue;
            vis[u] = true;
            for (int i = 0; i < G[u].size(); i++)
            {
                Edge& e = edges[G[u][i]];
                if (d[e.to] > d[u] + e.dist)
                {
                    d[e.to] = d[u] + e.dist;
                    p[e.to] = G[u][i];
                    Q.push(HeapNode(e.to, d[e.to]));
                }
            }
        }
    }
    void output(int start,int end)
    {
        if (end == start)
        {
           cout<<A[end]; 
            return ; 
        }
        output(start,edges[p[end]].from); 
        cout<<"->"<<A[end];
    }
}gao;
int map1[1009][1009];
void init1()
{
	for(int i = 1 ;i <= 13;++i)
	{
		for(int j = 1;j <= 13;++j)
		{
			map1[i][j] = rand()%1000+10;
		}
	}
	A[1] = "學校大門";A[2] = "領創空間中關村";A[3] = "老校區各教學樓";A[4] = "菜鳥驛站";A[5] = "夢溪湖";
	A[6] = "匯森樓";A[7] = "圖書館";A[8] = "體育館";A[9] = "田徑場";A[10] = "餐廳";A[11] = "宿舍樓";A[12] = "開水房";A[13] = "齊賢廣場";
}
void view()
{
	printf("┏-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ┓\n");
	puts("|1.       學校大門                        學校的門面                                |\n");
	puts("|2.       領創空間中關村                英才聚集之地                                |\n");
	puts("|3.       老校區各教學樓          裏面包含了幾個學院                                |\n");
	puts("|4.       菜鳥驛站              同學們收發快遞的地方                                |\n");
	puts("|5.      	夢溪湖                    學校裏面的活水湖,水質良好,魚蝦成羣            |\n");
	puts("|6.       匯森樓                      大學生創業的地方,雄偉壯觀                    |\n");
	puts("|7.       圖書館       藏書豐富,環境優雅,同學們的備考必去之處                     |\n");
	puts("|8.       體育館        是南工學子展現青春活力的地方,可容納兩千多名觀衆            |\n");
	puts("|9.       田徑場        塑膠跑道,看臺,各屆運動會舉辦的場地                        |\n");
	puts("|10.      餐廳            分爲風味餐廳,民族餐廳還有大餐廳,物美價廉                |\n");
	puts("|11.      宿舍樓        學生居住的地方,環境幽靜,均配備空調,冬暖夏涼              |\n");
	puts("|12.      開水房               免費提供開水                                         |\n");
	puts("|13.      齊賢廣場           學生們文藝活動的場所                                   |\n");
	printf("┗-*-*_*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ┛\n");
	printf("按數字鍵繼續。。\n");
	char t;
	cin>>t;
}
void viewlu()
{
	printf("┏-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ┓\n");
	puts("|1.       學校大門                                                                  |\n");
	puts("|2.       領創空間中關村                           老校區各教學樓                   |\n");
	puts("|3.                                                                                 |\n");
	puts("|4.                 夢溪湖                                                          |\n");
	puts("|5.      	         匯森樓                                                           |\n");
	puts("|6.                                                                                 |\n");
	puts("|7.       圖書館                       齊賢廣場                                     |\n");
	puts("|8.                                                                                 |\n");
	puts("|9.         體育館                                                                  |\n");
	puts("|10.                                                                                |\n");
	puts("|11.          田徑場                                                                |\n");
	puts("|12.             餐廳         開水房                           菜鳥驛站             |\n");
	puts("|13.                           宿舍樓                                               |\n");
	printf("┗-*-*_*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ┛\n");
	printf("按數字鍵繼續。。\n");
	char t;
	cin>>t;
 } 
void print()
{
	printf("\n                                      南陽理工學院校園導遊圖\n");
	printf("                         ┏ *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*┓\n");
	printf("                          *             1.瀏覽校園全景            * \n");
	printf("                          *             2.查看所有遊覽地          * \n");
	printf("                          *             3.選擇出發點和目的地      * \n");  
	printf("                          *             4.顯示路徑                * \n");
	printf("                          *             5.添加路徑                * \n");  
	printf("                          *             6.刪除路徑                * \n");
	printf("                          *             7.退出系統                * \n");
	printf("                         ┗ *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*┛\n");
	printf("Option-->:");
}
void liangdicha()
{
	gao.init(1000);
	int u= 0; 
	for(int i = 1 ;i <= 13;++i)
	{
		for(int j = 1;j <= 13;++j)
		{
			if(i == j)
			{
				continue;
			}
			cout<<"從"<<A[i]<<"->"<<A[j]<<"的路乘是"<<map1[i][j]<<",";putchar('\n'); 
			gao.AddEdge(i,j,map1[i][j]);
		}
	}
	putchar('\n');
	printf("按數字鍵繼續。。\n");
	char t;
	cin>>t;
}
void liangdicha1()
{
	gao.init(1000);
	int u= 0; 
	for(int i = 1 ;i <= 13;++i)
	{
		for(int j = 1;j <= 13;++j)
		{
			if(i == j)
			{
				continue;
			}
			gao.AddEdge(i,j,map1[i][j]);
		}
	}
}
void add()
{
	int x,y,step;
	printf("請輸入兩地的編號和路乘\n");
	printf("請輸入開始地編號\n");
	cin>>x;
	printf("請輸入結束地編號\n");
	cin>>y;
	printf("請輸入兩地長度\n");
	cin>>step;
	map1[x][y] = min(map1[x][y],step);
	printf("添加成功!\n");
	printf("按數字鍵繼續。。\n");
	char t;
	cin>>t;
} 
void detele()
{
	int x,y,step;
	printf("請輸入兩地的編號\n");
	printf("請輸入開始地編號\n");
	cin>>x;
	printf("請輸入結束地編號\n");
	cin>>y;
	map1[x][y] = INF;
	printf("添加成功!\n");
	printf("按數字鍵繼續。。\n");
	char t;
	cin>>t;
}
void djs()
{
	int a;int b;
	for(int i = 1;i <= 13;++i)
	{
		cout<<i<<":";
		cout<<A[i]<<endl;
	 } 
	 liangdicha1();
	puts("請選擇開始地方編號\n"); 
	cin>>a;
	puts("請選擇結束地方編號\n");
	cin>>b;
	gao.dijkstra(a);
	cout<<"從"<<A[a]<<"到"<<A[b]; 
	if(gao.d[b] == 	INF)
	{
		printf("無路\n");
	}
	else{
		printf("最短路爲%d\n",gao.d[b]);
	}
	puts("路徑爲:");
	gao.output(a,b); 
	putchar('\n');
	printf("按數字鍵繼續。。\n");
	char t;
	cin>>t;
}
int main()
{
	system("color e0");//設置調試窗口背景和字體顏色
	init1();
	while(1)
	{
		system("cls");
		print();
		int a;
		cin>>a;
		switch(a)
		{
			case 1:view();break;
			case 2:viewlu();break;
			case 3:djs();break;
			case 4:liangdicha();break;
			case 5:add();break;
			case 6:detele();break;
			case 7:return 0;break;
			default:break;
		}	
	}
	return 0;
}

實現圖:

功能1: 

功能2

功能3: 選擇開始地點和結束地點輸出路徑

:

 

功能4:隨機生成路徑

 

 功能5:添加路徑

功能6;刪除路徑

功能7退出 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章