?? qt.h
字號:
/******************************************************
Copyright (c), 2007, xiaohan, swust.
FileName: QT.h
Author: xiaohan Version:1.0 Date:2007.01.03
Discrition: 實現校園導游模擬
History: 無
<author> <time> <version> <desc>
xiaohan 2007/01/03 1.0 實現模擬的有關函數
*******************************************************/
struct RowColWeight
{
int row; //景點代碼-1
int col; //景點代碼-1
int weight; //兩個景點的路徑長度(權)
}
rcw[22] = {{0, 1, 300}, {1, 0, 300}, {0, 3, 200}, {3, 0, 200},{0, 2, 150},
{2, 0, 150}, {2, 4, 200}, {4, 2, 200}, {3, 4, 400}, {4, 3, 400},{2, 5, 600},
{5, 2, 600}, {5, 6, 700}, {6, 5, 700}, {6, 7, 50},{7, 6, 50}, {7, 8, 30},
{8, 7, 30}, {5, 8, 650}, {8, 5, 650},{8,9,150},{9,8,150}};
void initialization1() //初始化用戶界面
{
cout << "****************************************"
<< "****************************************" << endl;
cout << " (代碼) 景點名稱"
<< endl << endl;
}
void initialization2() //初始化用戶界面
{
cout << "請選擇一項:"
<< " (Y或y)瀏覽景點介紹" << endl
<< " (N或n)查詢任意兩個景點間的最短路徑 "
<< endl <<" (E或e)退出" << endl;
}
/*************************************************
函數名稱: Print
函數功能: 打印景點及代碼
Called: 無
Called By: Welcome
輸入參數: item
輸出參數: 無
返回值: 無
其它說明: 無
*************************************************/
void Print(Sight item) //輸出菜單(景點及其代碼)
{
cout << " (" << item.Num
<< ") "
<< item.Name << endl;
}
/*************************************************
函數名稱: Welcome
函數功能: 打印歡迎用戶界面
Called: Print
Called By: main Function
輸入參數: g
輸出參數: 無
返回值: 無
其它說明: 無
*************************************************/
void Welcome(AdjMWGraph &g)
{
cout << " 您好!歡迎光臨西南科技大學" <<
endl << endl;
cout << "下面是我校景點及代碼: " << endl;
cout << "****************************************"
<< "****************************************" <<endl;
cout << " (代碼) 景點名稱"
<< endl << endl;
for(int l = 0; l < 10; l++)
{
Print(g.GetValue(l));
} //for語句結束
cout << endl;
cout << "****************************************"
<< "****************************************" << endl;
initialization2();
}
/*************************************************
函數名稱: GreatGraph
函數功能: 建立圖
Called: InsertVertex InsertEdge
Called By: InsertG
輸入參數: n e g V[] E[]
輸出參數: 無
返回值: 無
其它說明: 無
*************************************************/
void CreatGraph(AdjMWGraph &G, DataType V[], int n, RowColWeight E[], int e)
{
for(int i = 0; i < n; i++) //向圖G中插入n個結點
{
G.InsertVertex(V[i]);
} //for語句結束
for(int k = 0; k < e; k++) //向圖G中插入e條邊
{
G.InsertEdge(E[k].row, E[k].col, E[k].weight);
} //for語句結束
}
/*************************************************
函數名稱: InsertG
函數功能: 插入校園圖
Called: CreatGrap
Called By: main Function
輸入參數: g
輸出參數: 無
返回值: 無
其它說明: 無
*************************************************/
void InsertG(AdjMWGraph &g)
{
int n = 10, e = 22; //景點數10,有向邊條數22
CreatGraph(g, W, n, rcw, e);
}
/*************************************************
函數名稱: SinghtMessage
函數功能: 打印景點信息
Called: 無
Called By: Run
輸入參數: 無
輸出參數: 無
返回值: 無
其它說明: 無
*************************************************/
void SightMessage() //景點信息
{
int t;
cin >> t;
cout << "**********************************"
<< "**********************************************" << endl;
switch(t - 1)
{
case 0:cout << "柳池:" << endl << endl << "小荷才露尖尖角,早有蜻"
<< "蜓立上頭。這是一個談情說愛的好地方!" << endl; break;
case 1:cout << "北山體育場:" << endl << endl << "有籃球場和網球場。"
<< "是一個學生進行體育鍛煉的好地方!" << endl; break;
case 2:cout << "龍山體育場:" << endl << endl << "一個足球場。"
<< "歷史悠久,有居高臨下之感。" << endl; break;
case 3:cout << "老區圖書館:" << endl << endl << "這是工學圖書館,"
<< "熱愛學習的學生都能在這里找到真理。" << endl; break;
case 4:cout << "西科花園:" << endl << endl << "學校內部的一個花園,"
<< "綠樹成蔭,夏天旁晚有很多游客在這里散步。" << endl; break;
case 5:cout << "科技中心:" << endl << endl << "2006年建成,"
<< "理學院當家做主,是學校的象征。" << endl; break;
case 6:cout << "行政樓:" << endl << endl << "學校行政中心,"
<< "許多會議等都在這里舉行。" << endl; break;
case 7:cout << "九洲湖:" << endl << endl << "不光是有許多學生在"
<< "這里背書,連魚兒也會露出湖面湊熱鬧。" << endl;break;
case 8:cout << "逸夫圖書信息中心:" << endl << endl << "這是綜合"
<< "圖書館,在這里,讀萬卷書,行萬里路 "<< endl;break;
case 9:cout << "新區運動場:" << endl << endl << "這是一個綜合運動場,"
<< "是舉行大型運動會的場所,2006年全國大學生足球聯賽南區決賽"
<< "在此舉行" << endl;break;
default:cout << "你輸入的景點不存在!" << endl;
} //switch語句結束
cout << "**********************************"
<< "**********************************************" << endl;
}
/*************************************************
函數名稱: Dijkstra
函數功能: 計算一個頂點到其它頂點的最短路徑
長度即目標景點的前一景點下標
Called: NumOfVertices GetWeight
Called By: Run
輸入參數: G v0
輸出參數: distance[] path[]
返回值: distance[] path[]
其它說明: 無
*************************************************/
void Dijkstra(AdjMWGraph &G, int v0, int distance[], int path[])
{
int n = G.NumOfVertices();
int *s = new int[n];
int minDis, i, j, u;
//初始化
for(i = 0; i < n; i++)
{
distance[i] = G.GetWeight(v0, i); //取v0到其它景點的距離存在數組中
s[i] = 0;
if(i != v0 && distance[i] < MaxWeight) path[i] = v0;
else path[i] = -1;
} //for語句結束
s[v0] = 1; //標記結點v0已從集合T加入到集合S中
//在當前還未找到最短路徑的結點集中選取具有最短距離的結點u
for(i = 1; i < n; i++)
{
minDis = MaxWeight;
for(j = 0; j <= n; j++)
{
if(s[j] == 0 && distance[j] < minDis)
{
u = j;
minDis = distance[j];
} //if語句結束
} //for語句結束
//當已不再存在路徑時算法結束;此語句對非連通圖是必要的
if(minDis == MaxWeight)return;
s[u] = 1; //標記結點u已從集合T加入到集合S中
//修改從v0到其它結點的最短距離和最短路徑
for(j = 0; j < n; j++)
{
if(s[j] == 0 && G.GetWeight(u, j) < MaxWeight &&
distance[u] + G.GetWeight(u, j) < distance[j])
{
//結點v0經結點u到其他結點的最短距離和最短路徑
distance[j] = distance[u] + G.GetWeight(u, j);
path[j] = u;
} //if語句結束
} //for語句結束
} //for語句結束
}
/*************************************************
函數名稱: Run
函數功能: 實現景點信息及最短路徑的輸出
Called: GetValue Print initialization1()
SightMessage() NumOfVertices()
Dijkstra Insert ListSize GetData
initialization2()
Called By: main Funtion
輸入參數: cmd g
輸出參數: 無
返回值: 無
其它說明: 無
*************************************************/
void run(char cmd,AdjMWGraph &g) //運行函數
{
cout << endl;
if(cmd != 'Y' && cmd != 'y' && cmd != 'N' &&
cmd != 'n' && cmd != 'E' && cmd != 'e')
cout << "輸入錯誤!請重新輸入:";
initialization1();
for(int l = 0; l < 10; l++)Print(g.GetValue(l));
cout << endl;
switch(cmd)
{
case 'Y': //瀏覽景點簡介
case 'y':
cout << "請選擇景點代碼: ";
SightMessage();
initialization2();
break;
case 'N': //求路徑長度
case 'n':
int m = g.NumOfVertices();
int *distance = new int[m];
int *path = new int[m];
int v1, v2;
cout << "請輸入要查詢的兩個景點的代號(用空格鍵隔開):";
cin >> v1 >> v2;
while(v1 < 1 || v1 > 10 || v2 < 1 || v2 > 10) //輸入景點不存在時繼續輸入
{
cout << "輸入錯誤!請重新輸入:";
cin >> v1 >> v2;
} //while語句結束
v1 = v1 - 1;
Dijkstra(g, v1, distance, path);
cout << "****************************************"
<< "****************************************" << endl;
//以下為求最短路徑長度
cout << "從景點“" << g.GetValue(v1).Name << "”到景點“"
<< g.GetValue(v2 - 1).Name << "”的最短路徑長度是:"
<< distance[v2 - 1] << "米" << endl;
cout << endl << "最短路線是:" << endl;
int i = v2 - 1; //以下為求最短路線
SeqList list;
while(i != v1)
{
if(path[i] != -1)
{
list.Insert(g.GetValue(path[i]),list.ListSize());
i = path[i];
} //if語句結束
} //while語句結束
for(int c = list.ListSize() - 1;c >= 0;c--)
{
cout << list.GetData(c).Name << "——>";
} //for語句結束
cout << g.GetValue(v2 - 1).Name << endl;
cout << endl;
cout << "****************************************"
<< "****************************************" << endl;
delete []distance; //清空
delete []path;
initialization2();
break;
} //switch語句結束
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -