离散数学实验----中国邮递员问题

article/2025/10/8 7:33:21

  1. 实验目的和要求
    1. 实验目的:
  1. 理解什么是欧拉图,熟悉欧拉路和欧拉回路的概念。
  2. 掌握Dijkstra算法,求解最短路径
  3. 掌握Fleury算法,求解欧拉回路。
  4. 了解Edmonds-Johnson算法解决中国邮递员问题的基本思路。
  5. 通过程序实现中国邮递员问题,强化其基本思想和实际应用。

    1. 实验要求:
  1. 针对下图所示加权图G,给出中国邮递员问题的解决方案。
  2. 用流程图简述解决中国邮递员问题的流程。
  3. 对核心算法(如Dijkstra算法、Fleury算法)进行编程实现。
  4. 分析实验结果,验证其正确性。
  5. 总结实验,撰写实验心得。

图G

  1. 实验环境和工具
    1. 编程语言:

    C++

    1. 编程环境(编译器):

Visual Studio 2019

  1. 实验结果
    1. 算法流程图

解题思路:

  1. 求出图G中奇数度顶点集合
  2. 若奇数度顶点个数为0<=>图G为欧拉图,直接使用Fleury算法求出欧拉回路,即最优邮路。
  3. 若奇数度顶点个数为2n(n=1,2,3......)<=>图G不是欧拉图,需添加一些重边。
  4. 用Dijkstra算法求出奇数度顶点两两之间的最短距离。
  5. 将奇数度顶点两两分组,遍历所有组合情况,根据已经求出的最短距离,找出最短的组合方式,即最优分组。
  6. 根据最优分组情况为图G添加重复边。
  7. 对添加重复边之后得到的图G’利用Fleury算法,求出欧拉回路,即此时的最优邮路。

流程图:

整体算法流程图

Fleury算法流程图

  1. 程序核心代码

判断是否为连通图:bool ConnectivityTest(int start, bool& bNoPoints){set<int> nodeSet; // 连通顶点集vector<int> test_nodes; // 与新加入连通点连通的未加入点集set<int> singlePoints; // 图中的单点集int i, j;// 先找出单点bool hasEdge = false;for (i = 0; i < V; i++){hasEdge = false;// 这里起始应该是0,不然最后一个点如果是单点则无法判断for (j = 0; j < V; j++) {if (Graph[i][j] > 0){hasEdge = true;break;}}if (!hasEdge){singlePoints.insert(i);}}// 设置bNoPoints标志bNoPoints = (singlePoints.size() == V);// start点必须在连通图中if (singlePoints.find(start) != singlePoints.end()) {return false;}test_nodes.push_back(start);while (test_nodes.size() > 0){int testNode = test_nodes.back();test_nodes.pop_back();for (i = 0; i < V; i++){if (Graph[testNode][i] > 0){if (nodeSet.insert(i).second){test_nodes.push_back(i);}}}}for (i = 0; i < V; i++){// 存在点既不是单点,也不在当前连通顶点集中,则这个点一定在其他连通子图中,返回假if (singlePoints.find(i) == singlePoints.end()&& nodeSet.find(i) == nodeSet.end()){return false;}}return true;}Dijkstra算法求最短距离int Dijstra(int v0, int v1, bool useCache){// 之前计算过了,直接返回值if (useCache && Cache[v0][v1] != 0) {return Cache[v0][v1];}int i, s, w, min, minIndex;bool Visited[MAX_NODE];//判断顶点是否被访问过// 初始化最短路径长度数据,所有数据都不是最终数据for (s = 0; s < V; s++){Visited[s] = false;Dist[s] = COST_NO_LINK; // 初始最大距离}// 首先选v0到v0的距离一定最短,最终数据Visited[v0] = true;Dist[v0] = 0;s = v0; // 0 预先选中v0点for (i = 0; i < V; i++){//更新该点到其他未选中点的最短路径for (w = 0; w < V; w++){if (!Visited[w] && Cost[s][w] < COST_NO_LINK&& Dist[w] > Dist[s] + Cost[s][w]){Dist[w] = Dist[s] + Cost[s][w];}}//如果在中间过程找到了目标点v1,则不再继续计算了if (s == v1){Cache[v0][v1] = Dist[s];Cache[v1][v0] = Dist[s];return Dist[s];}//选中相应点min = COST_NO_LINK;for (w = 0; w < V; w++){if (!Visited[w] && Dist[w] < min){minIndex = w;min = Dist[w];}}s = minIndex;Visited[s] = true;}}找出最优分组bool Grouping(int level){int i, j, findI = -1;for (i = 0; i < V; i++){if (Odd_Group[i] == 1){Odd_Group[i] = level; // 找到第一个组合点。findI = i;break;}}bool re = true;// 这里是形成一对新的组合后的地方,此时应该计算各组合最小路径之和。if (findI == -1)  {int weightSum = 0;// 根据level的值可以知道分组的取值是从2到level-1的,所以i如是计数for (i = 2; i < level; i++) {int index[2];int* pIndex = index;for (j = 0; j < V; j++){if (Odd_Group[j] == i){*pIndex = j;// 设置了第二个index值if (pIndex == index + 1) {break;}pIndex++;}}weightSum += Dijstra(index[0], index[1], true); // 这里暂时只计算最短路权值和,不实际上添加边,最后才添加。这样加边计算只会调用一次。}// 当前组合比以往要优,将当前的排列组合情况更新到全局if (weightSum < Shortest_Path_Weight) {Best_Grouping(); // 如果当前分组比以往都好,备份一下Shortest_Path_Weight = weightSum;return true; // 找到了更优组合,返回递归调用为真}else{return false; // 没找到了更优组合,返回递归调用为假}}else if (findI > -1){// 上面找到了第一个点了,现在从上面继续找第二个点。for (/* 继续上面的for */; i < V; i++){// 找到第二个点if (Odd_Group[i] == 1) {Odd_Group[i] = level;re = Grouping(level + 1);Odd_Group[i] = 1; // 无论当前分组是不是当前最好分组,我们都还要继续查找剩余分组情况}}}else{cerr << "findCount值异常" << endl;exit(-1);}if (findI > -1){Odd_Group[findI] = 1; // 无论当前分组是不是最好分组,我们都还要继续查找剩余分组情况}return re;}Fleury算法求欧拉回路void Fleury(int start) {int i;int vi = start; // v0e1v1…eivi已经选定bool bNoPoints, bCnecTest;cout << "你要的结果:";while (true) {// 找一条不是割边的边ei+1for (i = 0; i < V; i++) {if (Graph[vi][i] > 0) {// 假设选定(vi,i)这条边Graph[vi][i]--; // 这里会破坏全局Graph的值,但暂时没影响了,都不用了。Graph[i][vi]--;bCnecTest = ConnectivityTest(i, bNoPoints);if (!bNoPoints && !bCnecTest) {Graph[vi][i]++;Graph[i][vi]++;continue;}// 选定(vi,i)这条边cout << (char)('a' + vi) << "->" << (char)('a' + i) << " ";sumWeight += Cost[vi][i];vi = i;break;}}if (i == V) {cout << endl;break; // 到这里边找完了}}}

    1. 运行结果

程序运行结构图

    1. 运行结果分析

假设权重为4的边长度为4个单位长度,其余以此类推。

由上述运行结果可得出图G的最短邮路长度为104个单位长度。

添加的重复边有5条:

  1. -b  2   a--e  5  c--d  5

d--h  4   j--k  3

添加重复边的总权重为19。

为了验证结果的正确性(也就是所添加重复边的正确性),我采用书本第239页上给出的定义来推导。

  1. 首先添加重边去除奇数度顶点。

图1

  1. 删除偶数条重边。

图2

  1. 调整回路中的权重问题,调整单边和重边。
  1. 重复边集E的长度之和不超过这个圈的长度的一半
  2. 图中没有二重以上的边

依据以上两点要求对图进行调整:

图3

图4

图5

可以发现图5已经满足了最优的两点条件,因此图5就是我们需要构造的欧拉图。

从图中可以得到最优情况添加的重复边为:

  1. -b  2   a--e  5  c--d  5

d--h  4   j--k  3

添加重复边的总权重是19。

图5的最优邮路的长度为104个单位长度。

        此结果与我实验得到的结果是完全一致的,一次这次实验的答案是准确无误的。

  1. 实验心得

本次实验,我结合老师上课所教的内容与自己课后在网上学习到的中国邮递员问题的相关内容以及算法,完成了此次实验,通过程序实现了中国邮递员问题,同时也强化了我对于中国邮递员问题基本思想的理解与实际应用的能力。

通过此次实验,让我加深了对于欧拉图的理解,熟悉了欧拉路和欧拉回路的基本概念,掌握了使用Dijkstra算法求解最短路径的方法,学习了使用Fleury算法求解欧拉回路的方法,同时我也学习并且了解了Edmonds-Johnson算法解决中国邮递员问题的基本思路。

此次实验,我解决中国邮递员问题的主要思路是Edmonds-Johnson算法的思路,但是我对其中的一些步骤进行了调整,Edmonds-Johnson算法在求解完最短路径之后是利用求解完全图,然后再在完全图中找出权值最小的完备匹配。我在这次实验中采用的是将奇数度顶点两两分组,遍历所有组合情况,根据已经求出的最短距离,找出最短的组合方式,即最优分组。根据最优分组情况为图G添加重复边。最后对添加重复边之后得到的图G’利用Fleury算法,求出欧拉回路,即此时的最优邮路。

经过本次实验我深刻的体会到中国邮递员算法是一个十分有意义的算法,它可以解决我们实际生活中的问题,通过这次实验对中国邮递员问题的解决,让我学习到了什么是中国邮递员算法,也让我学习了如何编程解决这个问题,求解出最后的最优邮路。还让我在课本上学习到的欧拉图等内容得到了巩固,并运用到了实际的算法问题之中。

在实验中我也遇到了许多的问题,就比如有的算法思路虽然简单,但是实现起来还是需要琢磨许久,并且还需要在网上或者课本上找寻相关的内容才能最后将其完成,虽然解决问题的过程是艰辛的,是需要花费时间的,但是我认为这是值得的,最后解决了问题之后也会让我觉得无比的喜悦。

最后我想说,这次实验带给我的收获是巨大的,不仅使我编写代码的能力得到了提升,同时也让我学习到了许多有用的算法,使我的知识得到了丰富。因此,在我看来这次实验对于我而言是十分有意义的。

  1. 源代码
#include <iostream>#include <cstdlib>//包含多种宏和常数值#include <set>#include <vector>#define MAX_NODE 100//最大结点数#define COST_NO_LINK INT_MAX//顶点之间没有连接的权值using namespace std;int Graph[MAX_NODE][MAX_NODE];//图int Cost[MAX_NODE][MAX_NODE];//权重int V, E, SP;//顶点数,边数,起始点int Odd_Group[MAX_NODE];//图的奇偶顶点情况int Best_Group[MAX_NODE];//保存当前最优分组策略int Shortest_Path_Weight(COST_NO_LINK);//添加边的最小权值int Dist[MAX_NODE];//求从v0到v1最短路径结果,里面包含v0到最短路径上各点的最短权值int Cache[MAX_NODE][MAX_NODE];//记录已经求过的最短路径值int sumWeight = 0;//记录最短路径长度//输入图的信息void Input() {int i, j;int m, n;char cs, cm, cn;int w;cout << "输入图的顶点数:";cin >> V;cout << "输入图边的数目:";cin >> E;cout << "输入起点:";cin >> cs;SP = cs - 'a';for (i = 0; i < V; i++){for (j = 0; j < V; j++){Graph[i][j] = 0;Cache[i][j] = 0;Cost[i][j] = COST_NO_LINK;}Cost[i][i] = 0; // 置自己到自己为0}cout << "输入" << E << "条边对应的顶点和权值(顶点从a开始编号):" << endl;for (i = 0; i < E; i++){cin >> cm >> cn >> w;m = cm - 'a';n = cn - 'a';Graph[m][n] += 1;Graph[n][m] += 1;Cost[m][n] = w;Cost[n][m] = w;}}//Dijstra算法求最短距离int Dijstra(int v0, int v1, bool useCache){// 之前计算过了,直接返回值if (useCache && Cache[v0][v1] != 0) {return Cache[v0][v1];}int i, s, w, min, minIndex;bool Visited[MAX_NODE];//判断顶点是否被访问过// 初始化最短路径长度数据,所有数据都不是最终数据for (s = 0; s < V; s++){Visited[s] = false;Dist[s] = COST_NO_LINK; // 初始最大距离}// 首先选v0到v0的距离一定最短,最终数据Visited[v0] = true;Dist[v0] = 0;s = v0; // 0 预先选中v0点for (i = 0; i < V; i++){//更新该点到其他未选中点的最短路径for (w = 0; w < V; w++){if (!Visited[w] && Cost[s][w] < COST_NO_LINK&& Dist[w] > Dist[s] + Cost[s][w]){Dist[w] = Dist[s] + Cost[s][w];}}//如果在中间过程找到了目标点v1,则不再继续计算了if (s == v1){Cache[v0][v1] = Dist[s];Cache[v1][v0] = Dist[s];return Dist[s];}//选中相应点min = COST_NO_LINK;for (w = 0; w < V; w++){if (!Visited[w] && Dist[w] < min){minIndex = w;min = Dist[w];}}s = minIndex;Visited[s] = true;}}// 图的连通性测试bool ConnectivityTest(int start, bool& bNoPoints){set<int> nodeSet; // 连通顶点集vector<int> test_nodes; // 与新加入连通点连通的未加入点集set<int> singlePoints; // 图中的单点集int i, j;// 先找出单点bool hasEdge = false;for (i = 0; i < V; i++){hasEdge = false;// 这里起始应该是0,不然最后一个点如果是单点则无法判断for (j = 0; j < V; j++) {if (Graph[i][j] > 0){hasEdge = true;break;}}if (!hasEdge){singlePoints.insert(i);}}// 设置bNoPoints标志bNoPoints = (singlePoints.size() == V);// start点必须在连通图中if (singlePoints.find(start) != singlePoints.end()) {return false;}test_nodes.push_back(start);while (test_nodes.size() > 0){int testNode = test_nodes.back();test_nodes.pop_back();for (i = 0; i < V; i++){if (Graph[testNode][i] > 0){if (nodeSet.insert(i).second){test_nodes.push_back(i);}}}}for (i = 0; i < V; i++){// 存在点既不是单点,也不在当前连通顶点集中,则这个点一定在其他连通子图中,返回假if (singlePoints.find(i) == singlePoints.end()&& nodeSet.find(i) == nodeSet.end()){return false;}}return true;}// 测试图中是否有度为奇的顶点,结果保存在中,返回奇度顶点数int OddTest(){int i, j, rSum, count;// 初始化for (i = 0; i < V; i++){Odd_Group[i] = 0; // 0表示不为奇Best_Group[i] = 0;}count = 0;for (i = 0; i < V; i++){rSum = 0;for (j = 0; j < V; j++){rSum += Graph[i][j]; // 求i行和}if (rSum % 2 == 1){Odd_Group[i] = 1;count++;}}return count;}//当前最优分组void Best_Grouping(){int i;for (i = 0; i < V; i++){Best_Group[i] = Odd_Group[i];}}// 对奇度顶点进行分组,level值从2开始取值。// 返回值表示当前这种分组是否是当前所找到中的最好分组。bool Grouping(int level){int i, j, findI = -1;for (i = 0; i < V; i++){if (Odd_Group[i] == 1){Odd_Group[i] = level; // 找到第一个组合点。findI = i;break;}}bool re = true;// 这里是形成一对新的组合后的地方,此时应该计算各组合最小路径之和。if (findI == -1)  {int weightSum = 0;// 根据level的值可以知道分组的取值是从2到level-1的,所以i如是计数for (i = 2; i < level; i++) {int index[2];int* pIndex = index;for (j = 0; j < V; j++){if (Odd_Group[j] == i){*pIndex = j;// 设置了第二个index值if (pIndex == index + 1) {break;}pIndex++;}}weightSum += Dijstra(index[0], index[1], true); // 这里暂时只计算最短路权值和,不实际上添加边,最后才添加。这样加边计算只会调用一次。}// 当前组合比以往要优,将当前的排列组合情况更新到全局if (weightSum < Shortest_Path_Weight) {Best_Grouping(); // 如果当前分组比以往都好,备份一下Shortest_Path_Weight = weightSum;return true; // 找到了更优组合,返回递归调用为真}else{return false; // 没找到了更优组合,返回递归调用为假}}else if (findI > -1){// 上面找到了第一个点了,现在从上面继续找第二个点。for (/* 继续上面的for */; i < V; i++){// 找到第二个点if (Odd_Group[i] == 1) {Odd_Group[i] = level;re = Grouping(level + 1);Odd_Group[i] = 1; // 无论当前分组是不是当前最好分组,我们都还要继续查找剩余分组情况}}}else{cerr << "findCount值异常" << endl;exit(-1);}if (findI > -1){Odd_Group[findI] = 1; // 无论当前分组是不是最好分组,我们都还要继续查找剩余分组情况}return re;}//加边void AddShortPath(int from, int to){int i, back;Dijstra(from, to, false); // 求最短路径,结果在dist数组中back = to;// from ... back ... towhile (back != from) {for (i = 0; i < V; i++){if (i != back&& Dist[i] < COST_NO_LINK&& Dist[back] < COST_NO_LINK && Dist[i] + Cost[i][back] == Dist[back]){Graph[i][back]++; // 添加一条边Graph[back][i]++;back = i;break;}}}}// 根据odd数组的分组情况添加最短路径void AddShortPaths(){int i, j;for (i = 0; i < V; i++){if (Best_Group[i] > 1){for (j = i + 1; j < V; j++){if (Best_Group[j] == Best_Group[i]){AddShortPath(i, j);break;}}}}}// 处理图中可能存在度为奇的情况void OddDeal(){// 判断是否存在为奇的点,有的话要处理int oddCount = OddTest();if (oddCount > 0){// 对为奇的点进行排列组合。。。Grouping(2); // 这里得到的odd2是最优的AddShortPaths(); // 根据odd数组添加最短路径}}/*用Fleury算法求最短欧拉回游假设迹wi=v0e1v1…eivi已经选定,那么按下述方法从E-{e1,e2,…,ei}中选取边ei+1:1)、 ei+1与vi+1相关联;2)、除非没有别的边可选择,否则 ei+1不能是Gi=G-{e1,e2,…,ei}的割边。3)、 当(2)不能执行时,算法停止。*/void Fleury(int start) {int i;int vi = start; // v0e1v1…eivi已经选定bool bNoPoints, bCnecTest;cout << "你要的结果:";while (true) {// 找一条不是割边的边ei+1for (i = 0; i < V; i++) {if (Graph[vi][i] > 0) {// 假设选定(vi,i)这条边Graph[vi][i]--; // 这里会破坏全局Graph的值,但暂时没影响了,都不用了。Graph[i][vi]--;bCnecTest = ConnectivityTest(i, bNoPoints);if (!bNoPoints && !bCnecTest) {Graph[vi][i]++;Graph[i][vi]++;continue;}// 选定(vi,i)这条边cout << (char)('a' + vi) << "->" << (char)('a' + i) << " ";sumWeight += Cost[vi][i];vi = i;break;}}if (i == V) {cout << endl;break; // 到这里边找完了}}}//主函数int main() {//输入图的数据Input();bool b;if (!ConnectivityTest(0, b)){cout << "该图不是连通图!\n";exit(0);}OddDeal(); // 处理可能的奇度点情况Fleury(SP); // 用Fleury算法求欧拉回游cout << "最优邮路的长度为:" << sumWeight << endl;return 0;}


http://chatgpt.dhexx.cn/article/icZZWiQW.shtml

相关文章

数据结构——中国邮递员问题

问题描述 代码 #include <stdio.h> #include <stdlib.h> #include <string.h>#define min(a,b) ( (a) < (b) ? (a) : (b) ) #define MAX_NODE 100 #define MAX_EDGE 100 #define INF 0x7fffffff // 表示两点不连通typedef struct {int number; …

[算法导论] 邮递员问题

邮递员问题 旅行商问题&#xff1a;给定一系列城市和每对城市之间的距离&#xff0c;求解访问每一座城市一次并回到起始城市的最短回路。&#xff08;遍历点&#xff0c;回到起点&#xff09; 哈密顿路径 哈密顿图 中国邮递员问题&#xff1a;邮差要设法找到一条最短路径&…

中国邮递员问题的深入剖析与算法实现(附例题及MATLAB、LINGO代码)

中国邮递员问题的深入剖析与算法实现 一、研究背景1.1 哥尼斯堡七桥问题1.2 欧拉图1.3 中国邮递员问题 二、中国邮递员问题深入解读2.1 问题重述2.2 奇偶点图上作业法[^1]2.3 最小二分匹配法1) 针对无向图2) 针对有向图 2.4 $fleury$算法 三、经典中国邮递员问题的具体实现3.1 …

中国邮路算法(中国邮递员问题)(详细)

通路&#xff1a;在无向图中由点边交替组成的序列就是通路&#xff08;如果这个图是简单的&#xff0c;那么也可以使用点的序列来表示&#xff09;&#xff0c;如果首尾的点相同&#xff0c;则称为一条回路 无向图的连通性&#xff1a;无向图中任意一对点之间均有通路 欧拉通路…

那些有趣的网站

之前分享过那些有意思的网站 &#xff0c;这里继续分享一波&#xff0c;也许你用得上。 福利单词 一边背单词一边看妹子的网站&#xff0c;用电脑打开&#xff0c;配合ctrlw 关闭新窗口&#xff0c;不知不觉就背了百来个词了 https://easychen.gitee.io/foxdict/ 工资计算器 简…

常用又有趣的网站大合集

〇、【Python challenge】通关代码及攻略 一、PIECES 拼图 PIECES 拼图网站用 30 个 CSS 碎片进行拼图&#xff0c;向我们呈现了 30 种濒临灭绝的动物。 二、小甲鱼编程学习工作室 包含了各种编程语言学习以及计算机基本操作的教学与奇技淫巧 三、Wolfram Alpha 这是由Wol…

超酷的13个CSS有趣学习网站

13个CSS有趣学习网站 今天来给大家推荐13个辅助你学习巩固知识的网站&#xff0c;让你边玩边学边记&#xff01; 因为这些网站大多都是国外的大佬们做的&#xff0c;所以网页大多都是英文&#xff0c;为了更好地使用&#xff0c;给你们推荐两个翻译的方式&#xff1a; 使用C…

电脑技巧:盘点10个非常实用且有趣的网站

目录 1、聆听大海的声音 2、在线生成Logo 3、今日热榜 4、十万个为什么&#xff08;大人版&#xff09; 5、视频创作导航 6、改图鸭 7、好看电影推荐 8、童年游戏合集 9、各种沙雕表情包 10、反向词典 今天给大家分享10个非常实用且有趣的网站&#xff0c;值得收藏&a…

科普:如何找到有趣的网站?

原址&#xff1a;http://shedingkong.lofter.com/post/302b9d_1943cf2# 其实我发各种网站的推荐&#xff0c;是为了给自己留用&#xff0c;也是因为现在的审查环境下&#xff0c;各种下载资源的分享十分痛苦。总有人问我怎么知道这么多网站&#xff0c;这里来介绍几种方法。 方…

你是否看到过如此有趣的AI网站?

1、营销文案&#xff1a;CopyAI: Create Marketing Copy In Seconds 2、美化ppt设计&#xff1a;https://www.beautiful.ai/ 3、图片修改&#xff1a;https://hotpot.ai 4、照片变视频&#xff1a;https://www.myheritage.com/deep-nostalgia 美化头像&#xff1a;Free Profil…

有趣好玩的python编程网站

✅作者简介&#xff1a;大家好我是hacker707,大家可以叫我hacker &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;python &#x1f4ac;推荐一款模拟面试、刷题神器&#x1f449;点击跳转进入网站 整理了一些非常有意思&#xff0c;适…

有趣的表白网站

今天看到一个傻瓜式的表白网址生成网站&#xff0c;觉得还挺有意思的&#xff0c;所以来分享一下。http://www.51bbw.cn/show/ 进入网址就会看到下面的界面&#xff1a; 然后就可以“量力而行”了&#xff0c;依据财力选择你想制作的模板&#xff0c;老白嫖怪一眼看中了“免费…

有趣的网站

黑客帝国文字雨生成器 AirPano 足不出户的旅行 创客贴 自媒体制图神器

实时查看Starlink在轨卫星、地面站数目和分布情况的有趣网站

记录一些SpaceX的Starlink相关的一些有趣有用小网站~ 一、实时查看Starlink在轨卫星数目和分布情况 https://satellitemap.space/ 除了可以看Starlink的&#xff0c;还可以看OneWeb和GPS的在轨卫星和分布情况&#xff1b; 截止到2022-4-23&#xff0c;共有卫星2283颗&#xf…

收藏全球最有趣的网站 (上)

在线玩转指尖陀螺-FFFFidget ←点击评分&#xff0c;有趣指数&#xff1a; 3.40星 风靡全球的指间小玩具&#xff01;网站可以在线体验指尖陀螺的迷之旋转&#xff0c;同时支持PC和移动端&#xff0c;手机玩起来更带感&#xff01; 传送门 http://ffffidget.com/ 继续阅读 →…

几个有创意有趣的网站推荐

几个有趣的网站推荐&#xff0c;这些网站很有创意&#xff0c;第一眼就很惊艳 都能打开&#xff0c;不过速度有点慢&#xff0c;一定要有耐心等待&#xff0c;因为有几个是国外的网站&#xff0c;如果是在手机上打开的&#xff0c;复制地址进浏览器 1、Marco Gomez &#xff0d…

记录一些有趣网站

https://css-tricks.com/ 2018.01.15更 腾讯游戏官方设计团队 http://tgideas.qq.com/?ADTAGmedia.gameweb.console 2018.01.16更 该文档库&#xff1a;http://tgideas.qq.com/doc/ 里面有个相关的一些干货 王者荣耀网站帮助管理平台 https://pvp.qq.com…

一个神奇的资源网站「有趣网站收藏家」共有186个站点资源-北忘山修改版

一个神奇的资源网站「有趣网站收藏家」共有186个站点资源-北忘山修改版 网站介绍 这个网站有点东西&#xff0c;目前收集了186个资源&#xff0c;小北当时拔下来之后发现都是作者纯html手写的&#xff0c;意思就是每每添加网站都是手动添加上去。小北整下来之后&#xff0c;做了…

有趣的网站合集

导航页面 1、有趣网址之家 – 收藏全球最有趣的网站 https://youquhome.com/ 一、电子图书及公开课程 1、国图公开课 依托国家图书馆宏富的馆藏资源&#xff0c;以服务国家战略、传播中华优秀传统文化、提高公众文化生活品质为主线。一方面整合多种文献资源&#xff0c;并结…

有趣网站盲盒项目设计

嗯&#xff0c;在这里再发一遍&#xff0c;期待有更多流量吧~ 2023-07-01:因docker误删&#xff0c;导致容器丢失&#xff0c;虽然gitee上有代码&#xff0c;数据库也有备份&#xff0c;重新恢复应该不是问题&#xff0c;但是博主二赛君不想折腾了&#xff0c;精力收敛&#xf…