``校园导航系统(用了广度优先搜索和最短路径算法)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXVnum 33
#define INF 60000
typedef struct//储存顶点信息
{
int NO;
char name[20];
}Vextpye;//存储名字的节点
typedef struct//邻接矩阵
{
int arcs[MAXVnum][MAXVnum];
Vextpye vex[MAXVnum];
int vexnum;
int arcnum;
}AdjMarix;//邻接矩阵
typedef struct {
char name[20];
}Tmp;//暂时存储校园的各个顶点
typedef struct
{
int queue[100];
int callback[2][100];
int pre, rear;
}Q;//队列还有回溯数组
Tmp b[33] = { "行政楼","报告厅","校史馆", " 教师饭堂", "运输大厅", "机电自动化学院学院楼", "人文教育学院楼",
"电子信息工程学院楼", "土木工程学院学院楼", "综合实验楼", "思源楼", "生科楼", "图书馆", "报告厅", "C3公共教学楼", "C4公共教学楼", "C5公共教学楼",
"C6公共教学楼", "北区学生宿舍区", "游泳馆", "南区宿舍区", "仙溪桥", " 仙溪桥 ", "有为广场 ", "体育馆",
"运动场", " D11学生活动中心", " 南区学院楼", "研究生学院楼", "北区饭堂", "南区饭堂", "西门 ", " 南门"};
int a[33][33] = { 0, 50, 60000, 100, 60000, 400, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 150, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
50, 0, 50, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 50, 0, 60000, 300, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
100, 60000, 60000, 0, 100, 60000, 60000, 60000, 100, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 300, 100, 0, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 50, 60000,
400, 60000, 60000, 60000, 60000, 0, 60000, 50, 60000, 50, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 50, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 0, 50, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 50, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 50, 50, 0, 60000, 100, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 100, 60000, 60000, 60000, 60000, 0, 50, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 100, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 50, 60000, 100, 50, 0, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 0, 50, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 500, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 400,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 50, 0, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 200, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 0, 50, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 50, 60000, 60000, 60000, 60000, 60000, 300, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 50, 0, 100, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 50, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 100, 0, 50, 60000, 50, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 50, 0, 50, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 50, 0, 75, 75, 60000, 60000, 60000, 60000, 60000, 700, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 50, 60000, 75, 0, 75, 60000, 60000, 60000, 60000, 50, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 75, 75, 0, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 350, 60000, 60000, 200, 60000, 350, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 0, 60000, 60000, 60000, 60000, 50, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 0, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 100, 60000, 100, 60000, 60000,
150, 60000, 60000, 60000, 60000, 50, 60000, 60000, 60000, 60000, 500, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 0, 60000, 60000, 60000, 60000, 60000, 60000, 400, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 50, 60000, 60000, 60000, 60000, 60000, 60000, 50, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 0, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 50, 60000, 60000, 60000, 60000, 50, 60000, 60000, 60000, 60000, 60000, 0, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 700, 60000, 60000, 50, 60000, 60000, 60000, 60000, 0, 200, 350, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 200, 0, 200, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 350, 60000, 60000, 60000, 60000, 60000, 350, 200, 0, 60000, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 200, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 0, 60000, 60000, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 100, 400, 60000, 60000, 60000, 60000, 60000, 60000, 0, 60000, 150, 60000, 500,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 100, 60000, 60000, 60000, 300, 60000, 60000, 60000, 60000, 60000, 200, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 0, 60000, 60000, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 100, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 150, 60000, 0, 60000, 60000,
60000, 60000, 60000, 60000, 50, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 350, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 0, 60000,
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 400, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 500, 60000, 60000, 60000, 0};//
void menu();//函数提前声明
void keydown(AdjMarix*p);
void featureshow();
AdjMarix* initMarix();
void showMarix(AdjMarix*p);
void shownumberfeature(AdjMarix*p);
void changeMap(AdjMarix*p);
void popqueue(Q* q, int start, int num);
void pushqueue(Q* q);
void enptyqueue(Q* q);
void BFS(Q* q, AdjMarix* p);
int findmin(Q* q, int j, int visit[]);
void initarray(Q* q);
void Dijkstra(Q* q,AdjMarix*p);
void Dijkstra(Q* q,AdjMarix*p)
{
int begin, end, i, j, visit[33] = { 0 }, tmp, find[20] = { 0 };
printf("请输入出发点的数字");
scanf("%d", &begin);
printf("请输入目的地的数字");
scanf("%d", &end);
initarray(q);
i = begin - 1;
q->callback[0][i] = 0;//先标记出发点的距离
while (1)
{
i = findmin(q, i, visit);
j = 0;
for (j = 0; j < 33; j++)//用遍历的方法查找
{
if (a[i][j] != 60000 && a[i][j] != 0 && visit[j] != 1)//visit来标记没有被访问到
{
if (q->callback[0][j] > p->arcs[i][j] + q->callback[0][i])
{
q->callback[0][j] = q->callback[0][i] + p->arcs[i][j];
q->callback[1][j] = i;
}
}
}
visit[i] = 1;
if (i == end - 1)//跳出的条件
break;
}
/*printf("%dm \n", q->callback[0][i]);*/
tmp = q->callback[0][i];
j = 0;
while (i != begin - 1)//回溯
{
find[j] = i + 1;
/*printf("%d ", i+1);*/
i = q->callback[1][i];
j++;
}
find[j] = i + 1;
/*printf("%d \n", i+1);*/
while (j >= 0)//为了输出美观多了一些小步骤
{
fputs(p->vex[find[j]-1].name, stdout);
/*printf("%d ", find[j]);*/
j--;
if (j == 0)
{
putchar('\n');
break;
}
printf("----->");
}
fputs(p->vex[find[j]-1].name, stdout);//输出名字且不打印回车
putchar('\n');
printf("%dm ", tmp);//打印多少米
putchar('\n');
}
int findmin(Q* q, int j, int visit[])//配合最短路径算法使用,寻找数组最短路径的节点
{
int min, tmp = j, i;//传j过来避免第一次标记时出现bug,出现bug的情况是第二次调用该函数的时候返回值有错
min = 60000;//先给个最大的
for (i = 0; i < 100; i++)//用遍历的方法来找
{
if (min > q->callback[0][i] && visit[i] != 1)//visit[]来避免查找到标记的节点
{
min = q->callback[0][i];
tmp = i;
}
}
return tmp;
}
void initarray(Q* q)//初始化队列
{
for (int i = 0; i < 100; i++)
{
q->callback[0][i] = 60000;
q->callback[1][i] = -1;
}
}
void menu()
{
printf("--------------------------欢迎使用校园导航小助手---------------------------\n");
printf(" 欢迎来到XX学院!\n\n\n");
printf(" 菜单选择\n");
printf(" 1.学校景点介绍 2.查看游览路线\n");
printf(" 3.查询景点之间的最短路径 4.景点信息查询\n");
printf(" 5.更改图信息 6.查询景点间的可行路径\n");
printf(" 7.打印邻接矩阵 8.退出\n");
printf("---------------------------------------------------------------------------\n");
printf("请输入你的选择\n");
}
void keydown(AdjMarix* p)
{
int chocie;
scanf("%d", &chocie);
Q* q = (Q*)malloc(sizeof(Q));
switch (chocie)
{
case 1:
printf("------------------------学校景点介绍------------------------\n");
featureshow();
break;
case 2:
printf("------------------------查看游览路线------------------------\n");
BFS(q, p);
break;
case 3:
printf("------------------------查询景点之间的最短路径--------------\n");
Dijkstra(q, p);
break;
case 4:
printf("------------------------景点信息查询------------------------\n");
shownumberfeature(p);
break;
case 5:
printf("-------------------------更改图信息-------------------------\n");
changeMap(p);
break;
case 6:
printf("------------------------查询景点间的可行路径-----------------\n");
printf("该功能还没上线");
break;
case 7:
printf("------------------------打印邻接矩阵------------------------\n");
showMarix(p);
break;
case 8:
printf("----------------------------退出----------------------------\n");
system("pause");
exit(0);
default:
break;
}
}
void popqueue(Q* q, int start, int num)
{
q->queue[q->rear] = num;
q->callback[1][q->rear] = start;
q->callback[0][q->rear] = num;
q->rear++;
}
void pushqueue(Q* q)
{
q->pre++;
}
void enptyqueue(Q* q)
{
int i, j;
for (i = 0; i < 100; i++)
{
q->queue[i] = -1;
q->callback[0][i] = 0;
q->callback[1][i] = 0;
}
q->pre = 1;
q->rear = 0;
}
void BFS(Q* q, AdjMarix*p)
{
char b[15] = { 0 }; int find[20] = { 0 };
int flag = 0;
int begin, end, i, j, n = 1, tmp, visit[33] = { 0 };
printf("请输入出发点的数字");
scanf("%d", &begin);
printf("请输入目的地的数字");
scanf("%d", &end);
enptyqueue(q);
i = begin - 1, j = 0;
while (i < 33)//也可以改成while(1),都一样的
{
if (visit[i] != 1)
{
j = 0;
for (j = 0; j < 33; j++)
{
if (p->arcs[i][j] >0 && p->arcs[i][j] < 60000)
{
if (n == 1)
{
popqueue(q, -1, i);
visit[i] = 1;
n = 2;
}
if (n != 1 && visit[j] != 1)
{
popqueue(q, i, j);
}
}
}
}
if (q->pre == q->rear)
{
printf("队列已满");
break;
}
j = 0;
visit[i] = 1;
i = q->queue[q->pre];
push(q);
if (i == end - 1)
break;
}
j = 100, tmp = 0, n = 0;
while (q->callback[0][j] != begin - 1)
{
for (j = 0; j < 100; j++)
{
if (q->callback[0][j] == i)
break;
}
find [n]= q->callback[0][j] + 1;
/*printf("%d ", q->callback[0][j] + 1);*/
b[tmp] = q->callback[0][j] + 1;
i = q->callback[1][j];
n++;
}
n--;tmp = 0;
while (n>=0)
{
j = find[n];
if(n!=0)i = find[n - 1];//计算距离
tmp = p->arcs[i-1][j-1] + tmp;
fputs(p->vex[j-1].name,stdout);//避免打印回车
if (n == 0)
{
putchar('\n');
break;
}
printf("----->");
n--;
}
printf("%dm", tmp);
putchar('\n');
}
void featureshow()
{
printf("1 A1 行政楼\n");
printf("2 A2 报告厅\n");
printf("3 A3 校史馆\n");
printf("4 A4 教师饭堂\n");
printf("5 A5 运输大厅\n");
printf("6 B1 机电工程和自动化学院学院楼\n");
printf("7 B2 人文教育和物理和光电学院学院楼\n");
printf("8 B3 电子信息工程学院学院楼\n");
printf("9 B4 土木工程学院学院楼\n");
printf("10 B5 综合实验楼\n");
printf("11 B6 思源楼\n");
printf("12 B7 生科楼\n");
printf("13 C1 图书馆\n");
printf("14 C2 报告厅\n");
printf("15 C3 公共教学楼\n");
printf("16 C4 公共教学楼\n");
printf("17 C5 公共教学楼\n");
printf("18 C6 公共教学楼\n");
printf("19 北区学生宿舍区 北区学生宿舍区\n");
printf("20 游泳馆 划水的地方\n");
printf("21 南区宿舍区 南区宿舍区\n");
printf("22 仙溪桥 全长三百米风紧优美\n");
printf("23 仙溪桥 观看仙溪湖的桥\n");
printf("24 有为广场 最大的广场\n");
printf("25 体育馆 外形像UFO设备挺好的\n");
printf("26 运动场 里面有观众台,足球场\n");
printf("27 D11 学生活动中心\n");
printf("28 B8 南区学院楼\n");
printf("29 D13 研究生学院楼\n");
printf("30 D12 北区饭堂\n");
printf("31 南区饭堂 南区饭堂\n");
printf("32 西门 北区大门\n");
printf("33 南门 南区大门\n");
}
AdjMarix* initMarix()
{
int i,j;
AdjMarix* p = (AdjMarix*)malloc(sizeof(AdjMarix));
for (i = 0; i < 33; i++)
{
p->vex[i].NO = i;
strcpy(p->vex[i].name, b[i].name);
for (j = 0; j < 33; j++)
{
p->arcs[i][j] = a[i][j];
}
}
p->vexnum = MAXVnum;
p->arcnum = MAXVnum;
return p;
}
void showMarix(AdjMarix* p)
{
int i, j;
for (i = 0; i < MAXVnum; i++)
{
for (j = 0; j < MAXVnum; j++)
{
printf("%d ", p->arcs[i][j]);
}
}
}
void shownumberfeature(AdjMarix*p)
{
int NO;
printf("请输入你要查询的景色的编号");
scanf("%d", &NO);
puts(p->vex[NO].name);
}
void changeMap(AdjMarix* p)
{
int i, j;
printf("请输入你要修改邻接矩阵的行(数字)");
scanf("%d", &i);
printf("请输入你要修改邻接矩阵的列(数字)");
scanf("%d", &j);
printf("请输入你要修改邻接矩阵的信息(数字)");
scanf("%d", &p->arcs[i-1][j-1]);
printf("修改后的信息是%d\n", p->arcs[i - 1][j - 1]);
printf("修改成功");
}
int main()
{
AdjMarix* p=initMarix();
while (1)
{
menu();
keydown(p);
system("pause");
system("cls");//清屏
}
return 0;
}
写矩阵一个小程序(无向图)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define INF 60000
int main()
{
int i,j;
int a[9][9];
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
a[i][j] = INF;
if (j == i)
a[i][j] = 0;
}
}
j = 0;
for (i = 0; i < 9; i++)
{
printf("请修改第%d行的数据\n",i+1);
while (j <= 9)
{
printf("请输入要修改列的数据,请不要小于%d\n");
scanf("%d", &j);
if (j > 9)
{
j = i;
break;;
}
printf("请输入要修改的数据\n", i + 1);
scanf("%d", &a[i][j-1]);
}
}
for (i = 0; i < 9; i++)
{
for (j = i; j < 9; j++)
{
a[j][i] = a[i][j];
}
}
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
printf("%d, ", a[i][j]);
}
putchar('\n');
}
return 0;
}
B站有算法的介绍链接:https://www.bilibili.com/video/BV1zz4y1m7Nq?from=search&seid=770348198429452645
https://www.bilibili.com/video/BV1Zp4y1z7Dd?from=search&seid=17065027014704371062
文章转载布尔青年:http://blog.qmgua.com/zb_system/admin/index.php?act=ArticleMng