神秘国度的爱情故事(C++数据结构课设)

目录

 1、题目

 2、代码

 3、运行图

 4、说明书


1、题目

 2、代码

#include<iostream>
using namespace std;
#define MAXNODE 10000        //小村最大个数
int visited[MAXNODE];      //标志数组

typedef struct Edge        //边结点
{
	int index;             //顶点在顶点数组中的位置
	struct Edge* nextedge; //指向下一个边结点
}EdgeNode;

typedef struct VNode       //顶点信息
{
	int data;              //顶点数据
	EdgeNode* firstedge;   //指向第一条边的指针 
}Link;

typedef struct             //定义邻接表
{
	int vertexnum, edgenum;//总顶点数和总边数
	Link vertics[MAXNODE]; //顶点数组
}Graph;

void CreateGraph(Graph& g)
{//采用邻接表表示法建立无向村落图
	cout << "小主,请输入神秘国度中的小村个数N:";
	while (true)
	{
		cin >> g.vertexnum;
		while(!cin.good())
		{
			cin.clear();
			cin.sync();
			system("COLOR 01");
			cout << "小主莫急,请重新输入:";
			cin >> g.vertexnum; 
		}
		if (1 <= g.vertexnum && g.vertexnum <= MAXNODE)  break;
		system("COLOR 01");
		cout << "小主莫急,请重新输入:";
	}
	system("COLOR F4");
	g.edgenum = g.vertexnum - 1;//道路数是村子数-1
	int i;
	for (i = 0; i < g.vertexnum; i++)
	{
		g.vertics[i].data=i;    //每个小村从0开始编号
		g.vertics[i].firstedge = NULL;
	}
	cout << "------------------------------------------\n" ;
	for (i = 0; i < g.edgenum; i++)
	{
		int m, n;
		cout << "请输入第" << i + 1 << "条道路的两个端点小村的编号:";
		while (true)
		{
			cin >> m >> n;
			while (!cin.good())
			{
				cin.clear();
				cin.sync();
				system("COLOR 01");
				cout << "小主莫急,请重新输入:";
				cin >> m >> n;
			}
			if (m >= 0 && m < g.vertexnum && n >= 0 && n < g.vertexnum)  break;
			system("COLOR 01");
			cout << "小主莫急,请重新输入:";
		}
		system("COLOR F4");
		if(i<g.edgenum-1)
		cout << "---------------------------\n" ;
		EdgeNode* p1 = new Edge;              //头插法,先建立一个Edge类型的结点p1
		p1->index = n;                        //将n村的编号赋值给p1的数据域
		p1->nextedge = g.vertics[m].firstedge;//将p1的指针域赋为空值
		g.vertics[m].firstedge = p1;          //将第m个表头结点的指针域指向p1
		EdgeNode* p2 = new Edge;              //建立无向图
		p2->index = m;
		p2->nextedge = g.vertics[n].firstedge;
		g.vertics[n].firstedge = p2;
	}
}

void BfsTree2(Graph g, int C , int B)
{//广度优先遍历邻接表,并查询B是否在C到所有未访问结点的路径上
	int k, Q[MAXNODE], front = 0, rear = 0;//使用队列
	int i = 0;
	EdgeNode* p;                      //指向边结点的指针
	visited[C] = 1;                   //C村开始所有访问过的村子标志为1
	rear = (rear + 1) % MAXNODE;      //计算队尾所在位置
	Q[rear] = C;                      //从C村开始
	while (front != rear)             //判断队空
	{
		front = (front + 1) % MAXNODE;//计算队头所在位置
		k = Q[front];
		p = g.vertics[k].firstedge;
		while (p != NULL && i != 1)   //是否为最后一个边结点
		{
			if (!visited[p->index])   //结点是否被访问过
			{
				visited[p->index] = 1;//标记已访问
				if (p->index == B)    //如果遍历到B
				{
					cout << "       YES 千里姻缘一路牵,一生甜蜜两村间" << endl;
					i = 1;
					rear = front;
				}
				if (i == 0)
				{
					rear = (rear + 1) % MAXNODE;
					Q[rear] = p->index;
				}
			}//访问结束 
			p = p->nextedge;
		}    //判断指针为空结束
	}        //判断队列为空结束
	if (i != 1)
		cout << "       NO  此情可待成追忆,只是当时已惘然" << endl; 
}

void BfsTree1(Graph g, int A, int B, int C)
{//广度优先遍历邻接表,并查询C是否在A和B之间的路径上
	int k, Q[MAXNODE], front = 0, rear = 0;//使用队列
	int i = 0;
	EdgeNode* p;                      //指向边结点的指针
	visited[A] = 1;                   //A村开始所有访问过的村子标志为1
	rear = (rear + 1) % MAXNODE;      //计算队尾所在位置
	Q[rear] = A;                      //从A村开始
	while (front != rear)             //判断队空 
	{
		front = (front + 1) % MAXNODE;//计算队头所在位置
		k = Q[front];
		p = g.vertics[k].firstedge;
		while (p != NULL && i != 1)   //是否为最后一个边结点
		{
			if (!visited[p->index])   //结点是否被访问过
			{
				visited[p->index] = 1;//标记已访问
				if (p->index == B)    //如果遍历到B
				{
					cout << "       NO  此情可待成追忆,只是当时已惘然" << endl;
					i = 1;
					front = rear;
				}
				else
				{
					if (p->index == C)//如果遍历到C
					{
						BfsTree2(g, C, B);
						i = 1;
						front = rear;
					}
				}
				if (i == 0)
				{
					rear = (rear + 1) % MAXNODE;
					Q[rear] = p->index;
				}
			}//访问结束
			p = p->nextedge;
		}    //判断指针为空结束
	}        //判断队列为空结束
}

void test(Graph g)
{//测试
	int M, i, j;
	int test1[MAXNODE], test2[MAXNODE], test3[MAXNODE];//用于存放测试组数据
	cout << "------------------------------------------\n";
	cout << "请输入测试组个数M:";
	while (true)
	{
		cin >> M;
		while (!cin.good())
		{
			cin.clear();
			cin.sync();
			system("COLOR 01");
			cout << "小主莫急,请重新输入:";
			cin >> M;
		}
		if (1 <= M && M <= MAXNODE)  break;
		system("COLOR 01");
		cout << "小主莫急,请重新输入:";
	}
	system("COLOR F4");
	cout << "------------------------------------------\n";
	for (i = 0; i < M; i++)
	{
		cout << "请输入第"<<i+1<<"组要测试的A B C三村的编号:";
		while (true)
		{
			cin >> test1[i] >> test2[i] >> test3[i];
			while (!cin.good())
			{
				cin.clear();
				cin.sync();
				system("COLOR 01");
				cout << "小主莫急,请重新输入:";
			cin >> test1[i] >> test2[i] >> test3[i];
			}
			if ((test1[i] >= 0 && test1[i] < g.vertexnum) &&
				(test2[i] >= 0 && test2[i] < g.vertexnum) &&
				(test3[i] >= 0 && test3[i] < g.vertexnum))
				break;
			system("COLOR 01");
			cout << "小主莫急,请重新输入:";
		}
		system("COLOR F4");
		if(i<M-1)
		cout << "---------------------------\n";
	}
	cout << "------------------------------------------\n";
	cout << "测试后的结果为:\n" ;
	for (i = 0; i < M; i++)
	{
		if (test1[i] == test3[i] || test2[i] == test3[i])
			cout << "       YES 千里姻缘一路牵,一生甜蜜两村间" << endl;
		else
		{
			for (j = 0; j < g.vertexnum; j++)
				visited[j] = 0;//所有未访问村子标志为0
			BfsTree1(g, test1[i], test2[i], test3[i]);
		}
	}
}

int main()
{
	system("COLOR F4");
	cout << "                ******   ******                " << endl;
	cout << "             ********** **********             " << endl;
	cout << "           *************************           " << endl;
	cout << "           ***神秘国度的爱情故事****           " << endl;
	cout << "           *************************           " << endl;
	cout << "            ***********************            " << endl;
	cout << "               *****************               " << endl;
	cout << "                 *************                 " << endl;
	cout << "                    *******                    " << endl;
	cout << "                       *                       " << "\n\n\n";
	Graph g;
	CreateGraph(g);
	test(g);
	cout << "\n\n";
	system("pause");
	return 0;
}

3、运行图

 4、说明书

        哈哈,说明书需要加我QQ:2059718410领取哦,因为我暂时不能上传资源。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
《C 3rd的旅行》是一本旅游书籍,以C国为背景,带领读者进行一次奇妙的冒险之旅。在这本书中,读者将有机会探索C国的美景、了解当地的文化和历史,并品尝到地道的美食。 这次旅行将从C国的首都开始。首都是一个充满现代化建筑和悠久历史的城市。读者可以参观宏伟的皇宫,欣赏壮丽的国会大厦,并游览宽阔的城市公园。 接下来,旅行将前往C国著名的风景胜地。“C之峰”是一个受欢迎的登山胜地,那里有壮丽的山峰和迷人的自然景观。登上山顶,你可以俯瞰整个城市的壮丽景色。 在C国的农村地区,你可以参观当地的农田,了解他们的耕作方式和传统农业文化。还可以体验农民的生活,品尝当地新鲜的农产品。 文化也是C国的一大魅力。在这次旅行中,你将参观传统艺术表演,如民族舞蹈和戏剧,感受当地文化的独特魅力。此外,你还可以参观历史悠久的博物馆,了解C国悠久的历史。 不可错过的当然是C国的美食。你将品尝到口味独特的当地特色菜肴,如烤肉串、炸鸡和糖醋鱼。当地人以烹饪技巧和丰富的调料闻名,这些美食将让你回味无穷。 通过这本书,《C 3rd的旅行》带给读者一场全方位的冒险之旅。无论是风景、文化还是美食,C国都有许多令人难以忘怀的经历。这本书不仅是一本旅游指南,更是一次深入了解C国的机会。它将激发读者的好奇心,让他们对这个神秘国度的探索之旅更加充满期待。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值