// NoDirectMapWay.cpp : 定义控制台应用程序的入口点。
/**
@coder:chaolee
@time:2014/12/06 11:30
@功能:无向图求简单路径
*/
#include "stdafx.h"
//常量定义:
#define MaxNode 20 //最大节点个数
#define InfoSize 10 //节点信息最大长度
#define FileName "D:\\map.dat" //图原始信息的配置文件
#define bufferSize 30 //文件行缓冲区大小
/****************************************************************************************/
//自定义数据类型定义:
typedef char InfoType[InfoSize]; //节点信息类型
typedef struct Anode{
int id; //节点Id
Anode * next; //下一个边节点
}ArcNode; //边节点定义
typedef struct Vnode{
int id; //节点Id
//InfoType info; //节点信息,在本例中未用到
bool IsAvailable; //该节点是否可走
ArcNode * firstarc; //第一个边节点
}VNode; //头结点定义
typedef VNode AdjList[MaxNode]; //AdjList是邻接表类型
typedef struct wayinfo{
int id; //记录当前位置id
ArcNode * p; //记录当前节点下一个节点的指针
}WayInfo;
typedef struct{
WayInfo stack[MaxNode]; //位置信息栈区
int top; //栈顶指针
}MapStack;
/*******************************************************************************************/
//自定义函数:
//求10的n次幂
int Pow10(int n)
{
int result = 1;
for (int i = 0; i < n; i++)
result *= 10;
return result;
}
//获取多位数 位移量pos自动变化
int GetNum(char *s,int &pos)
{
char buff[5] = {0}; //数字缓冲区,最大支持5位数
int i = 0,j=0,result=0;
while (*(s + pos) >= '0'&&*(s + pos) <= '9'&&i<5){
buff[i] = *(s + pos);
i++; pos++;
}
i--;
for (j = i; j >= 0; j--)
result += (buff[j] - '0')*Pow10(i-j);
return result;
}
//从文件中创建图 v为邻接表头结点数组指针
bool FiletoMap(VNode * v)
{
char buffer[bufferSize] = {0};
FILE *fp = NULL;
int i=0,j=0;
char ch;
ArcNode *temp = NULL;
fopen_s(&fp,FileName,"rb"); //打开文件
if (fp == NULL)
return false; //打开失败返回false
while (!feof(fp)){ //循环读取文件行
memset(buffer,0,bufferSize);
fgets(buffer, 30, fp);
j = 0;
if (*buffer == ';'|| *buffer=='\0')
continue;
else{
(v + i)->id = GetNum(buffer,j); //头结点id赋值
(v + i)->IsAvailable = true; //将该头结点状态改为可以使用
(v + i)->firstarc = NULL;
for (j++; (ch=*(buffer + j)) != '\r' && ch!='\0'; j++){
if (ch == ',')
continue;
else{
temp = (ArcNode *)malloc(sizeof(ArcNode)); //分配边节点空间
temp->id = GetNum(buffer,j);
temp->next = (v+i)->firstarc;
(v + i)->firstarc = temp;
j--;
}
}
i++;
}
}
fclose(fp); //关闭文件资源
return true;
}
//判断某点是否可走
bool IsReachable(VNode * m,ArcNode * p)
{
return (m + p->id)->IsAvailable;
}
//给出起点和终点在图中寻找所有路径(用栈实现)
bool FindWayfromMap(VNode * m,int start,int stop,int must=-1,int mustnot=-1)
{
int wayCount = 0; //路径计数
int idTemp=0;
char suffix[5] = {0}; //输出前缀缓冲区,最长为4个字节
MapStack ms; //定义路径栈
ms.top = -1; //栈初始化
if (start >= MaxNode || (m + start)->IsAvailable == false){ //判断起点是否在图中
printf("图中没有这个起点,你确定没有在逗我!");
return false;
}
if (stop >= MaxNode || (m + stop)->IsAvailable == false){ //判断终点是否在图中
printf("图中没有这个终点,你确定没有在逗我!");
return false;
}
ms.stack[++ms.top].id = (m + start)->id; //当前节点进栈
ms.stack[ms.top].p = (m + ms.stack[ms.top].id)->firstarc; //初始化当前节点的下一个
(m + ms.stack[ms.top].id)->IsAvailable = false; //将该点位置设置为不可走
while (ms.top > -1){ //栈不空,循环
if (ms.stack[ms.top].id == stop){ //找到一条路径
if (must == -1 && mustnot == -1){
printf("第%d条路径为:\t", ++wayCount);
for (int i = 0; i <= ms.top; i++){ //输出找到的路径
printf("%s %d", suffix, ms.stack[i].id);
strcpy_s(suffix, 3, "->");
}
printf("\n");
memset(suffix, 0, 5);
}
else if (must != -1){
bool mustMark=false;
for (int i = 0; i <= ms.top; i++)
if (ms.stack[i].id == must){
mustMark = true;
break;
}
if (mustMark == true){
printf("第%d条路径为:\t", ++wayCount);
for (int i = 0; i <= ms.top; i++){ //输出找到的路径
printf("%s %d", suffix, ms.stack[i].id);
strcpy_s(suffix, 3, "->");
}
printf("\n");
memset(suffix, 0, 5); //恢复前缀为空
}
}
else if (mustnot != -1){
bool mustnotMark = false;
for (int i = 0; i <= ms.top; i++)
if (ms.stack[i].id == mustnot){
mustnotMark = true;
break;
}
if (mustnotMark == false){
printf("第%d条路径为:\t", ++wayCount);
for (int i = 0; i <= ms.top; i++){ //输出找到的路径
printf("%s %d", suffix, ms.stack[i].id);
strcpy_s(suffix, 3, "->");
}
printf("\n");
memset(suffix, 0, 5); //恢复前缀为空
}
}
(m + ms.stack[ms.top].id)->IsAvailable = true; //退栈
ms.top--;
if (ms.top>-1)
ms.stack[ms.top].p = ms.stack[ms.top].p->next; //将退栈后的栈顶元素的下一个处理元素后移
}
if (ms.stack[ms.top].p == NULL) { //该节点没有下一个节点,则继续退栈
(m + ms.stack[ms.top].id)->IsAvailable = true;
ms.top--;
if (ms.top>-1)
ms.stack[ms.top].p = ms.stack[ms.top].p->next;
}
else{
if (IsReachable(m, ms.stack[ms.top].p)){ //下一个节点可走,进栈
idTemp = ms.stack[ms.top].p->id;
ms.stack[++ms.top].id = idTemp;
ms.stack[ms.top].p = (m + idTemp)->firstarc;
(m + idTemp)->IsAvailable = false;
}
else //下一个节点不可走,则考虑下下个节点
ms.stack[ms.top].p = ms.stack[ms.top].p->next;
}
}
if (wayCount == 0)
return false;
else
return true;
}
//给出起点和终点在图中寻找所有路径(用递归实现)
void FindWayfromMapbyRecursion(VNode * m,int start,int stop, MapStack * st,int &count)
{
if ((m + start)->IsAvailable != true)
return ;
st->stack[++st->top].id = start;
(m + start)->IsAvailable = false;
if (st->stack[st->top].id == stop) //找到一条路径并输出
{
printf("第%d条路径:\t",++count);
for (int i = 0; i <= st->top; i++)
printf("->%d",st->stack[i].id);
printf("\n");
}
else{
ArcNode * temp = (m + start)->firstarc;
while (temp != NULL){ //循环处理周围节点
FindWayfromMapbyRecursion(m, temp->id, stop, st, count);
temp = temp->next;
}
}
st->top--;
(m + start)->IsAvailable = true;
}
//销毁图
void DestroyMap(VNode *m)
{
ArcNode * temp=NULL,*p = NULL;
for (int i = 0; i < MaxNode; i++){
temp = (m + i)->firstarc;
if ((m + i)->id != -1){
while (temp != NULL){
p = temp->next;
free(temp);
temp = p;
}
}
}
}
//主函数
int _tmain(int argc, _TCHAR* argv[])
{
AdjList m; //定义图的邻接表头结点数组
int start = 0, stop = 14, must = 6, mustnot = 12;
for (int i = 0; i < MaxNode; i++){ //初始化头结点数组
m[i].id = -1;
m[i].IsAvailable = false; //设置每个节点状态为不可使用
}
if (!FiletoMap(m)){ //从文件中创建图的邻接表类型
printf("文件读取失败,错误不可修复,即将退出!\n");
system("PAUSE");
return -1;
}
printf("%d到%d路径为:\n",start, stop);
if (!FindWayfromMap(m, start, stop))
printf("NULL!\n");
printf("\n");
printf("%d到%d且必须经过%d的全部路径为:\n", start, stop,must);
if (!FindWayfromMap(m, start, stop,must))
printf("NULL!\n");
printf("\n");
printf("%d到%d且必须不能经过%d的全部路径为:\n", start, stop,mustnot);
if (!FindWayfromMap(m, start, stop,-1, mustnot))
printf("NULL!\n");
printf("\n");
MapStack ms;
ms.top = -1;
int count = 0;
printf("%d到%d路径为:\n", start, stop);
FindWayfromMapbyRecursion(m,start,stop,&ms,count);
if (count == 0)
printf("NULL\n");
printf("\n销毁图...\n\n");
DestroyMap(m);
system("PAUSE");
return 0;
}
/******************************************************************************
*说明:
*要求图的编号必须从0开始,且不能超过MaxNode
*必须包含某节点求路径函数名和寻找全部路径相同,但是需要将必须节点的id当做第三个参数传进函数
*必须不能包含某节点求路径函数名与求全部路径函数相同,但是需要将-1传进第三个参数,第四个参数传必须不能经过的节点
*******************************************************************************/一个例子的代码
相关推荐
STM32F407 FreeRTOS+LVGL移植实战:从驱动适配到性能优化
本文详细介绍了在STM32F407开发板上移植FreeRTOS和LVGL的实战经验,涵盖硬件准备、驱动适配、性能优化等关键步骤。通过TFTLCD屏幕驱动优化、DMA加速和任务优先级调整,显著提升界面流畅度,为嵌入式GUI开发提供实用解决方案。
位运算
位运算中设计到的操作有:与、或、非、异或、左移、右移。题目一:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数,例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2。 分析: 1.将给定的整数右移,并且判断每一次右移之后最低位是否为1. 2.设置一个flag,每次将flag左移,判断给定的整数每一位是否为1. 3.将一个数与它减一相与,会将这个数最右边的1变为0.
010Editor实战:5分钟破解Zip伪加密文件(附BUUCTF真题解析)
本文详细介绍了如何使用010Editor快速破解Zip伪加密文件,包括BUUCTF真题的完整解析。通过修改关键字节,轻松解除伪加密状态,适用于CTF竞赛和实际工作场景,提升文件处理效率。
java递归调用实例 迷宫
java递归调用实例 迷宫
Halcon 简单的形状匹配定位与区域跟随
【代码】Halcon简单的形状匹配定位与区域跟随。
Unity集成阿里Qwen2.5-Omni全模态大模型实战:语音交互与多模态AI开发指南
本文详细介绍了在Unity中集成阿里Qwen2.5-Omni全模态大模型的实战指南。通过C#脚本开发,实现语音交互、图像分析等多模态AI功能,涵盖API调用、音频处理、流式响应解析等核心步骤,为游戏、虚拟人等Unity应用提供沉浸式智能交互解决方案。
C语言中常见库函数编写(占坑)
strcpy函数:如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案: 2分 void strcpy( char *strDest, char *strSrc ) { while( (*strDest++ = * strSrc++) != ‘\0’ ); }4分 void strcpy( char *strDest, const char *strSrc ) //将
从源码编译CesiumForUnreal
从源码编译CesiumForUnreal插件
Find a way (双bfs、重载小于号是要全(map)!!!)
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 35884 Accepted Submission(s): 11404 Problem Description Pass a year learning in H...
【unity实战】Unity2D TileMap的探究(最简单,最全面的TileMap使用介绍)
之前有人在微信上找我,问了TileMap相关的知识【unity实战】随机地下城生成2——绘制地图Tilemap的使用及一些技巧的使用(含源码)不过写的不是特别不是特别细致,只是简单的用了一下,所有这次特地打算单独写一篇文章,来介绍一下,下次还有人问我,我直接就把这篇文章丢给他,完美!Unity的Tilemap 一般称之为瓦片地图或者平铺地图,是 Unity2017 中新增的功能,主要用于快速编辑 2D 游戏中的场景,通过复用资源的形式提升地图多样性。Tilemap是一个用于创建2D地图的工具。
国科大学习资料--矩阵论(叶世伟)-期末考试题整理3
国科大学习资料–矩阵论-期末考试题整理3 国科大学习资料–矩阵论-期末考试题整理3 国科大学习资料–矩阵论-期末考试题整理3
hdu2612 Find a way
原文链接: hdu2612 Find a way 上...
【VTKExamples::Meshes】第十二期 QuadricDecimation
本文分享VTK样例QuadricDecimation,并解析接口vtkQuadricDecimation,希望对各位小伙伴有所帮助!
使用map的find头文件_map::insert and map::find
/*2010-4-10 wcdj*/#include #include #include #include #include // pairusing namespace std;int main(){map > > mfamily;string surname;vector > pchildren;while (1){cout<cin>>surname;if(...
RU DOS版、EFI版32bit/64bit BIOS常用工具
DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
map::insert and map::find
定义一个map对象,其元素的键是家族姓氏,而值则是用pair类型的对象存储该家族孩子名字和年龄的vector对象,并且可以通过基于家族姓氏的查询输出该家族所有孩子的名字。[注意][1] map对象的类型为 map > >[2] pair类型的头文件为utility[3] map对象的insert操作,m.insert(value_type),其返回值为pair类型对象:pa
精雕软件(JDpaint) 5.5 绿色版
精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版
HDU 2612 find a way
跑两遍BFS,开数组记录到达KFC步数。
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
Find a way
题目描述 Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki. Yifenfei’s home is at
D - Find a way
D -Find a way Time Limit:1000MSMemory Limit:32768KB64bit IO Format:%I64d & %I64u Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Le...
【简单搜索】Find a way
Find a way 问题描述 Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki. Yifenfei’s ho...
HDU-2612-Find a way
HDU-2612-Find a way http://acm.hdu.edu.cn/showproblem.php?pid=2612 求2个点到KFC的距离之和,使其最小,可用2次BFS,分别求出2个点到各个KFC的最短距离,然后找出和最小的即可 #include #include #include #define max 0x7fffffff int n,m; char map[250
635



被折叠的 条评论
为什么被折叠?



