图的遍历(基础)

news2024/11/15 12:07:39

一、图的遍历的相关定义

  •  遍历的定义:从已给的连通图中的某一顶点出发,沿着一些边访遍图中的所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。
  • 遍历的实质:找每个邻接点的过程。
  • 图的特点:图中可能存在回路,且图中任一顶点都有可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。
  • 怎样避免重复访问?                                                                                                                     解决思路:设置辅助数组visited[n],用来标记每个被访问过的顶点。                                        1.初始状态visited[i]为0  ;2.顶点被访问,改visited[i]为1,防止被多次访问 

二、深度优先搜索 

  • 深度优先搜索(Depth-First Search)是指按照深度方向搜索,它类似于树的先根遍历,是树的先根遍历的推广。 
  • 深度优先搜索连通子图的基本思想是:                                                                                      1.从图中某个顶点v0出发,首先访问v0。                                                                                    2.找出刚访问过的顶点vi的第一个未被访问的邻接点, 然后访问该顶点。以该顶点为新顶点,重复本步骤,直到当前的顶点没有未被访问的邻接点为止。                                                      3.返回前一个访问过的且仍有未被访问的邻接点的顶点, 找出并访问该顶点的下一个未被访问的邻接点,然后执行步骤2 
  • 采用递归的形式说明,则深度优先搜索连通子图的基本思想可表示为:                              1. 访问出发点v0。                                                                                                                      2.依次以v0的未被访问的邻接点为出发点,深度优先搜索图,直至图中所有与v0有路径相通的顶点都被访问。 若此时图中还有顶点未被访问,则另选图中一个未被访问的顶点作为起始点,重复上述深度优先搜索过程,直至图中所有顶点均被访问过为止。 
  • 树的深度优先遍历
void PreOrder(TreeNode* R)
{
	if (R != NULL)
	{
		visit(R);//访问根结点
		while (R还有下一个子树T)
		{
			PreOrder(T);//先根遍历下一棵子树
		}
	}
}

基于邻接矩阵的深度优先遍历 

  •  深度优先遍历的伪代码
bool visited[MAXV];//访问标记数组
void DFS(MGraph G, int v);//从第v个顶点开始,深度优先遍历
{
	visit(v);//访问第v个顶点
	visited[v] = true;//将第v个顶点设置为已经访问的标记
	for (int w = FirstNeighbor(G, v); w > 0; w = NextNeighbor(G, v, w))
	{
		if (!visited[w])//第w个顶点为第v个顶点尚未访问的邻接点
		{
			DFS(G, w);
		}
	}
}

注意;
int FirstNeighbor(MGraph G, int x);//求图G中顶点x的第一个邻接点,若有则返回顶点号;
//若没有邻接点或图中不存在x,则返回-1
int NextNeighbor(MGraph G, int x, int y);
//假设图G中第y个顶点是第x个顶点的一个邻接点,
//返回除第y个顶点之外,第x个顶点的下一个邻接点的顶点号;若第y个顶点是第x个顶点的最后一个邻接点,则返回-1
  •  深度优先遍历的动画演示

 

  •  基于邻接矩阵存储方式的遍历完整代码
  •  MGraph.h
#pragma once
#include<iostream>
#include<stdbool.h>
#include<stdio.h>
using namespace std;

#define MaxVertexNum 100//顶点数目的最大值
//#define INFINITY  100000//宏定义常量“无穷”
#define MAXV 100

typedef int VertexType;//顶点的数据类型
//typedef char VertexType;//顶点的数据类型
typedef int EdgeType;//带权图中边上权值的数据类型
typedef struct
{
	VertexType vexs[MaxVertexNum];//顶点表(存放顶点)
	EdgeType edges[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表(存放任意两个顶点之间的距离)
	int n, e;//图的当前顶点数和边数/弧数
}MGraph;

void CreatMat(MGraph& G, int A[][MAXV], int n);//由数组A[n][n]生成邻接矩阵G
//生成图的邻接矩阵方法1
void DisMGraph(MGraph& G);//打印

void Init(MGraph& G);//初始化,将所有顶点都初始化为没有访问的顶点
void DFS(MGraph G, int v);//从第v个顶点开始,深度优先遍历
int FirstNeighbor(MGraph G, int x);//求图G中顶点x的第一个邻接点,若有则返回顶点号;
//若没有邻接点或图中不存在x,则返回-1
int NextNeighbor(MGraph G, int x, int y);//假设图G中顶点y是顶点x的一个邻接点,
//返回除y之外顶点x的下一个邻接点的顶点号;若y是x的最后一个邻接点,则返回-1
  •  MGraph1.cpp
#include"MGraph.h"

void CreatMat(MGraph& G, int A[][MAXV], int n)//由数组A[n][n]生成邻接矩阵G
{
	G.n = n;
	G.e = 0;
	cout << "请依次输入顶点信息:";
	for (int i = 1; i <= G.n; i++)
	{
		cin >> G.vexs[i];
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			G.edges[i + 1][j + 1] = A[i][j];//i+1,j+1是为了从为了从二维数组[1][1]开始存储
			if (A[i][j] != 0 && A[i][j] != INFINITY)
			{
				G.e++;//边数加1
			}
		}
	}
}
void DisMGraph(MGraph& G)//遍历打印
{
	for (int i = 1; i <= G.n; i++)
	{
		for (int j = 1; j <= G.n; j++)
		{
			cout << G.edges[i][j] << " ";
		}
		cout << endl;
	}
}


bool visited[MAXV];//访问标记数组
void Init(MGraph& G)//初始化
{
	for (int i = 1; i <= G.n; i++)
	{
		visited[i] = false;//标记为访问
	}
}

void DFS(MGraph G, int v)//从第v个顶点(下标也是v)开始,深度优先遍历
{

	cout << G.vexs[v] << " ";//访问第v个顶点
	visited[v] = true;//将第v个顶点改为已经访问的标记
	for (int w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w))
	{
		if (!visited[w])
		{
			DFS(G, w);
		}
	}
}

int FirstNeighbor(MGraph G, int x)//求图G中第x个顶点的第一个邻接点,若有则返回顶点号;
//若没有邻接点或图中不存在x,则返回-1
{
	for (int j = 1; j <= G.n; j++)
	{
		if (G.edges[x][j] == 1)//寻找第x个顶点的第一个邻接点
		{
			return j;//返回第x个顶点的第一个邻接点的顶点号
		}
	}
	return -1;
}
int NextNeighbor(MGraph G, int x, int y)//假设图G中第y个顶点是第x个顶点的一个邻接点,
//返回除第y个顶点之外,第x个顶点的下一个邻接点的顶点号;若第y个顶点是第x个顶点的最后一个邻接点,则返回-1
{
	int i = 1, j = 1;
	for (int k = y + 1; k <= G.n; k++)//在邻接矩阵第x个顶点所在行
		//从第y个顶点之后寻找与第x个顶点邻接的顶点
	{
		if (G.edges[x][k] == 1)
		{
			return k;
		}
	}
	return -1;
}
  • Text.cpp
#include"MGraph.h"
int main()
{
	MGraph G;
	int A[][MAXV] = { {0,1,0,0,1,0,0,0},{1,0,0,0,0,1,0,0},{0,0,0,1,0,1,1,0},{0,0,1,0,0,0,1,1},{1,0,0,0,0,0,0,0},{0,1,1,0,0,0,1,0}, {0,0,1,1,0,1,0,1},{0,0,0,1,0,0,1,0} };
	CreatMat(G, A, 8);//方法1
	cout << "图的邻接矩阵:" << endl;
	DisMGraph(G);
	cout << endl;
	/*cout << G.vexs[4] << endl;
	cout<<FirstNeighbor(G,2)<<endl;
	cout << NextNeighbor(G, 2, 1);*/

	Init(G);//初始化
	cout << "从2出发的深度优先遍历序列:" << endl;
	DFS(G, 2);

	cout << endl;
	Init(G);//初始化
	cout << "从3出发的深度优先遍历序列:" << endl;
	DFS(G, 3);

	//cout << endl;
	//Init(G);//初始化
	//cout << "从1出发的深度优先遍历序列:" << endl;
	//DFS(G, 5);

	return 0;
}
  •  结果

 

  •  非连通图的深度优先遍历
void DFSTraverse(MGraph G)//对图G进行深度优先遍历
{
	Init(G);//初始化
	for (int v = 1; v <= G.n; v++)
	{
		if (!visited[v])//对每个连通分量调用一次DFS
		{
			DFS(G, v);
		}
	}
}
  • 完整代码
#pragma once
#include<iostream>
#include<stdbool.h>
#include<stdio.h>
using namespace std;

#define MaxVertexNum 100//顶点数目的最大值
//#define INFINITY  100000//宏定义常量“无穷”
#define MAXV 100

typedef int VertexType;//顶点的数据类型
//typedef char VertexType;//顶点的数据类型
typedef int EdgeType;//带权图中边上权值的数据类型
typedef struct
{
	VertexType vexs[MaxVertexNum];//顶点表(存放顶点)
	EdgeType edges[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表(存放任意两个顶点之间的距离)
	int n, e;//图的当前顶点数和边数/弧数
}MGraph;

void CreatMat(MGraph& G, int A[][MAXV], int n);//由数组A[n][n]生成邻接矩阵G
//生成图的邻接矩阵方法1
void DisMGraph(MGraph& G);//打印

void Init(MGraph& G);//初始化,将所有顶点都初始化为没有访问的顶点
void DFS(MGraph G, int v);//从第v个顶点开始,深度优先遍历
int FirstNeighbor(MGraph G, int x);//求图G中顶点x的第一个邻接点,若有则返回顶点号;
//若没有邻接点或图中不存在x,则返回-1
int NextNeighbor(MGraph G, int x, int y);
//假设图G中第y个顶点是第x个顶点的一个邻接点,
//返回除第y个顶点之外,第x个顶点的下一个邻接点的顶点号;若第y个顶点是第x个顶点的最后一个邻接点,则返回-1
void DFSTraverse(MGraph G);//对图G进行深度优先遍历(图G可以是非连通图)

 

#include"MGraph.h"

void CreatMat(MGraph& G, int A[][MAXV], int n)//由数组A[n][n]生成邻接矩阵G
{
	G.n = n;
	G.e = 0;
	cout << "请依次输入顶点信息:";
	for (int i = 1; i <= G.n; i++)
	{
		cin >> G.vexs[i];
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			G.edges[i + 1][j + 1] = A[i][j];//i+1,j+1是为了从为了从二维数组[1][1]开始存储
			if (A[i][j] != 0 && A[i][j] != INFINITY)
			{
				G.e++;//边数加1
			}
		}
	}
}
void DisMGraph(MGraph& G)//遍历打印
{
	for (int i = 1; i <= G.n; i++)
	{
		for (int j = 1; j <= G.n; j++)
		{
			cout << G.edges[i][j] << " ";
		}
		cout << endl;
	}
}


bool visited[MAXV];//访问标记数组
void Init(MGraph& G)//初始化
{
	for (int i = 1; i <= G.n; i++)
	{
		visited[i] = false;//标记为访问
	}
}

void DFS(MGraph G, int v)//从第v个顶点(下标也是v)开始,深度优先遍历
{

	cout << G.vexs[v] << " ";//访问第v个顶点
	visited[v] = true;//将第v个顶点改为已经访问的标记
	for (int w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w))
	{
		if (!visited[w])
		{
			DFS(G, w);
		}
	}
}

int FirstNeighbor(MGraph G, int x)//求图G中第x个顶点的第一个邻接点,若有则返回顶点号;
//若没有邻接点或图中不存在x,则返回-1
{
	for (int j = 1; j <= G.n; j++)
	{
		if (G.edges[x][j] == 1)//寻找第x个顶点的第一个邻接点
		{
			return j;//返回第x个顶点的第一个邻接点的顶点号
		}
	}
	return -1;
}
int NextNeighbor(MGraph G, int x, int y)//假设图G中第y个顶点是第x个顶点的一个邻接点,
//返回除第y个顶点之外,第x个顶点的下一个邻接点的顶点号;若第y个顶点是第x个顶点的最后一个邻接点,则返回-1
{
	int i = 1, j = 1;
	for (int k = y + 1; k <= G.n; k++)//在邻接矩阵第x个顶点所在行
		//从第y个顶点之后寻找与第x个顶点邻接的顶点
	{
		if (G.edges[x][k] == 1)
		{
			return k;
		}
	}
	return -1;
}

void DFSTraverse(MGraph G)//对图G进行深度优先遍历
{
	Init(G);//初始化
	for (int v = 1; v <= G.n; v++)
	{
		if (!visited[v])//对每个连通分量调用一次DFS
		{
			DFS(G, v);
		}
	}
}
  • 结果 

 基于邻接表的深度优先遍历

 

  • 邻接表的深度优先遍历的伪代码 
int visited[MAXV] = { 0 };
void DFSA(AGraph* G, int i)//邻接表的深度优先算法,i表示从第i个顶点开始深度优先遍历
{
	ArcNode* p;
	visited[i] = 1;
	cout << G->adjlist[i].data<<" ";//访问顶点vi
	p = G->adjlist[i].firstarc;//取vi边表的头指针
	while (p)//寻找vi的邻接点vj
	{
		if (!visited[p->adjvex])//若vj尚且未被访问,则以vj为出发点向纵深搜索
		{
			DFSA(G, p->adjvex);
		}
		p = p->nextarc;//找vi的下一个邻接点
	}
}
  •  完整代码
  • AGraph.h 
#pragma once
#include<iostream>
#include<stdbool.h>
#include<stdio.h>
using namespace std;

//输入流的头文件
#include <cstring>           
#include <io.h>    
#include <fstream>
#define txtRows       8 //txt行数
#define txtCols       8 //txt列数

typedef int ElemType;
typedef int InfoType;
#define MAXV 100
#define INF 10000
typedef struct ANode//边结点类型
{
	int adjvex;//该边的终点位置
	struct ANode* nextarc;//指向一下条边的指针
	InfoType info;//该边的相关信息,如带权图可存放权重
}ArcNode;

typedef struct Vode//表头结点的类型
{
	ElemType data;//顶点信息
	ArcNode* firstarc;//指向第一条边
}VNode;

typedef VNode AdjList[MAXV]; //AdjList是邻接表类型
typedef struct
{
	AdjList adjlist;//邻接表(表头结点组成一个数组)
	int n, e;//定义顶点数和边数
}AGraph;//图的领接表类型

void CreatAdj(AGraph*& G, int A[][MAXV], int n);//由数组A[n][n]生成邻接矩阵G
//生成图的邻接表
void DisAdj(AGraph* G);//打印
void DFSA(AGraph* G, int i);//邻接表的深度优先算法,i表示从第i个顶点开始深度优先遍历
  •  AGraph1.cpp
#include"AGraph.h"

void CreatAdj(AGraph*& G, int A[][MAXV], int n)//由数组A[n][n]生成邻接表G
{
	G = (AGraph*)malloc(sizeof(AGraph));//分配邻接表空间
	G->n = n;
	G->e = 0;
	cout << "请依次输入顶点信息:";
	for (int i = 1; i <= n; i++)//邻接表的所有表头结点的指针域都设置为空
	{
		cin >> G->adjlist[i].data;
		G->adjlist[i].firstarc = NULL;
	}

	ArcNode* p = NULL;
	for (int i = 0; i < n; i++)
	{
		for (int j = n - 1; j >= 0; j--)
		{
			if (A[i][j] != 0 && A[i][j] != INF)//存在一条边
			{
				p = (ArcNode*)malloc(sizeof(ArcNode));//创建一个边结点p
				p->adjvex = j+1;//该边的终点
				p->info = A[i][j];//该边的权重
				p->nextarc = G->adjlist[i+1].firstarc;//将新边结点p用头插法插入到顶点Vi的边表头部
				G->adjlist[i+1].firstarc = p;
				G->e++;//对于无向图,边数需要除以2
			}
		}
	}
}


void DisAdj(AGraph* G)//打印
{
	ArcNode* p;
	for (int i = 1; i <= G->n; i++)
	{
		cout << "[" << i << "]" << G->adjlist[i].data;
		p = G->adjlist[i].firstarc;//找到顶点i的第一个邻接点
		while (p != NULL)
		{
			cout << "->";
			cout << p->adjvex;
			p = p->nextarc;//找到下一个邻接点
		}
		cout << endl;
	}
}


int visited[MAXV] = { 0 };
void DFSA(AGraph* G, int i)//邻接表的深度优先算法,i表示从第i个顶点开始深度优先遍历
{
	ArcNode* p;
	visited[i] = 1;
	cout << G->adjlist[i].data<<" ";//访问顶点vi
	p = G->adjlist[i].firstarc;//取vi边表的头指针
	while (p)//寻找vi的邻接点vj
	{
		if (!visited[p->adjvex])//若vj尚且未被访问,则以vj为出发点向纵深搜索
		{
			DFSA(G, p->adjvex);
		}
		p = p->nextarc;//找vi的下一个邻接点
	}
}
  •  Text.cpp
#include"AGraph.h"
int main()
{
	int A[MAXV][MAXV];
	FILE* fp;
	errno_t err = fopen_s(&fp, "C:\\Users\\86173\\Desktop\\Data1.txt", "r");
	//注意:Data.txt的属性中显示的是C:\Users\86173\Desktop
	//需要将单斜杠变双斜杠,双斜杠变四斜杠

	if (fp == NULL)
	{
		cout << "文件读取错误!";
		return -1;
	}
	for (int i = 0; i < txtRows; i++)
	{
		for (int j = 0; j < txtCols; j++)
		{
			fscanf_s(fp, "%d", &A[i][j]);/*每次读取一个数,fscanf_s函数遇到空格或者换行结束*/
		}
		fscanf_s(fp, "\n");
	}
	fclose(fp);

	AGraph* G;
	CreatAdj(G, A, 8);
	cout << "邻接表形式:" << endl;
	DisAdj(G);
	cout << endl<<"邻接表的深度遍历序列为:";
	DFSA(G, 2);

	return 0;
}
  •  结果

 

  •  Data1.txt数据
0 1 0 0 1 0 0 0
1 0 0 0 0 1 0 0
0 0 0 1 0 1 1 0
0 0 1 0 0 0 1 1
1 0 0 0 0 0 0 0
0 1 1 0 0 0 1 0
0 0 1 1 0 1 0 1
0 0 0 1 0 0 1 0

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跌倒自动检测雷达的应用

跌倒是老人最常发生的意外之一&#xff0c;据统计&#xff0c;我国每年有150多万老人跌倒身亡。如何及时发现和预防老人跌倒以及避免可能发生的伤害事件&#xff0c;已成为目前社会关注的热点。美国加州大学伯克利分校研究人员研发出一种可穿戴设备——跌倒自动检测雷达&#x…

大规模MIMO通信系统的发射端采用混合波束成形附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

阅读笔记 DAGA 低资源标记任务数据扩充方法

阅读笔记 DAGA 低资源标记任务数据扩充方法 文章目录阅读笔记 DAGA 低资源标记任务数据扩充方法前言概述IntroductionBackground1、NER2、Part-of-Speech (POS) Tagging3、Target Based Sentiment AnalysisProposed Method1、Labeled Sentence Linearization2、Language Modeli…

c#入门-命名参数

位置参数 在你填入实参时&#xff0c;你填入的类型和顺序都需要和形参相同。 因为默认情况下&#xff0c;他是按照从左到右的顺序依次填入实参的。 命名参数 你在声明参数时给变量声明的名字是有用的。 在填入实参时&#xff0c;可以加上名字&#xff0c;以指定你填入的是哪…

触觉智能分享-低成本高性能的厨电解决方案

每个热爱生活的人&#xff0c;一日三餐四季&#xff0c;柴米油盐这点小事&#xff0c;都值得去享受&#xff0c;可如何学会做一顿美味可口的饭菜&#xff0c;对厨房小白来说可不是易事&#xff0c;智能菜谱的出现&#xff0c;将做菜的烹饪过程进行了分步拆解&#xff0c;同时将…

基于STM32波形信号发生器proteus仿真设计(仿真+程序+报告+讲解)

基于STM32波形信号发生器proteus仿真设计(仿真程序报告讲解&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;C0075 讲解仿真视频&#xff1a; 基于STM32的波形信号发生器proteus仿真设计主要功能&#xff1a…

nessus无法导出报告(nessus转中文报告)

nessus漏扫报告&#xff0c;可是nessus导出的报告全是英文&#xff0c;客户说看不懂(说的好像中文就能看懂似的)。找了很多nessus转中文报告的工具都不是很靠谱&#xff0c;今天突然灵机一动发现了一个解决nessus无法导出报告方法。总的说来就是生产一个html文件转中文。 ness…

入门系列 - Git安装与配置

Git安装与配置 要使用Git&#xff0c;你必须在你的电脑上安装它。要不要使用并升级到最新的Git&#xff0c;那取决您的需要了。 下载Git 要下载Git安装程序&#xff0c;请访问Git的官方网站并进入下载页面。本文写于2022-11-29&#xff0c;此时您可以去官网链接去下载&#…

AI教你学测试

ChatGPT这个词相信大家最近看到都不会陌生&#xff0c;应该刷爆了各位的朋友圈&#xff0c;各种分享注册教程、什么AI写代码的文章比比皆是&#xff0c;今天&#xff0c;让我们一起来看一下OpenAI能不能教我们学测试呢&#xff0c;对测试人员的日常工作是否有帮助呢&#xff1f…

原生API编写简单富文本编辑器004

原生API编写富文本编辑器004 遗留的问题&#xff1a; 设置的字体是使用 font属性&#xff0c;而非CSS设置的字号只接受1-7, 并且是以 size 属性而非 CSS控制&#xff0c;超出大小无法设置。color使用HTML的input时&#xff0c;始终有一个input框在那里&#xff0c;并且如果手…

Oracle项目业务表单设计:Oracle PrimaveraUnifier BP

目录 基本介绍 Basic Introduction 业务流程组件 Business Process Components 数据定义 Data Definitions 数据要素 Data Elements 状态 Status 表单 Forms 工作流程 &#xff08;可选&#xff09;Workflow 日志 Log 上部表单 Upper Form 详细表单 Detail Form 行项…

找不到msvcr110dll,无法继续执行代码,解决方法分享

找不到msvcr110dll,无法继续执行代码&#xff0c;电脑出现这种情况&#xff0c;主要是缺失了msvcr110dll这个文件。 要解决这个问题&#xff0c;其实不难&#xff0c;有多种方法 第一种解决msvcr110dll的方法 1在百度搜索下载msvcr110.dll文件 2下载后将文件放在c盘windows…

Stimulsoft Dashboards.PHP 2022.4.5 Crack

Stimulsoft Dashboards.PHP 是一个用于设计和查看仪表板的完整软件包。您可以使用该工具集成到您的应用程序中或作为独立的解决方案。同时&#xff0c;不需要复杂的配置或第三方模块。您可以轻松地将仪表板集成到几乎任何 PHP 应用程序中。 仪表板设计器是一个直接影响分析面板…

【推荐学习收藏】9种回归算法及实例总结的太详细了

我相信很多人跟我一样&#xff0c;学习机器学习和数据科学的第一个算法是线性回归&#xff0c;它简单易懂。由于其功能有限&#xff0c;它不太可能成为工作中的最佳选择。大多数情况下&#xff0c;线性回归被用作基线模型来评估和比较研究中的新方法。 在处理实际问题时&#…

Web大学生网页作业成品——游戏主题HTM5网页设计作业成品 (HTML+CSS王者荣耀8页)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

043-推箱子游戏源代码3

上一讲:042-推箱子游戏源代码2 摘要: 1、使用JAVA基础知识 2、GUI界面编程实现推箱子界面,常用控件的综合应用; 3、使用JAVA绘图技术实现推箱子过程的绘图功能; 4、使用键盘事件,通过方向键实现推箱子过程; 5、使用音频技术,实现播放背景音乐功能; 6、使用IO流技…

从西北工业大学被攻击说起,谈网络安全的最后一道防线—密码

一、背景 据央视2022年9月5日报道&#xff0c;我国西北工业大学&#xff08;以下简称西工大&#xff09;遭到美国国家情报局特定入侵办公室&#xff08;代号TAO&#xff09;非法入侵&#xff0c;目前已查明涉案人员13人&#xff0c;攻击次数一千余次&#xff0c;大量关键核心数…

保姆级微信双开教程

不知道大家是不是和我一样&#xff0c;两个微信账号&#xff0c;一个用于工作&#xff0c;一个用于私人。 一般来说&#xff0c;日常生活中使用的登录微信的设备也就3种&#xff0c;PC、Android、IOS。这三种设备中&#xff0c;Android经过各种厂商对OS的优化后&#xff0c;基本…

动态规划入门-01背包问题

动态规划入门-01背包问题 问题描述 假设你有个最大载重量为300kg300kg300kg的背包&#xff0c;有4个物品。它们的重量分别为123kg,88kg,93kg,100kg123kg,88kg,93kg,100kg123kg,88kg,93kg,100kg&#xff0c;价值分别为$$10,$19,$8,$20$。 请问背包内最大可以放入多少价值的物品…

第二证券|ChatGPT被“玩坏”,美图大涨45%,AIGC赛道风口来了?

AIGC&#xff08;人工智能主动生成内容&#xff09;近期被ChatGPT带火了&#xff01; 近来明星人工智能公司OpenAI发布了全新的谈天机器人模型ChatGPT。该模型能够主动生成代码以及绘画、答复一系列问题、承认自己的错误、质疑不正确的假设&#xff0c;乃至回绝不合理的要求&a…