Map Find Way

【ACM- OJ】《Find a way》C++ 【ACM- OJ】《Find a way》C++题目描述输入输出样例输入样例输出AC代码 题目描述 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 the countrysi 阅读详情
// 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传进第三个参数,第四个参数传必须不能经过的节点
*******************************************************************************/
一个例子的代码
【数据分享】中国371个城市的坡度矢量数据和excel数据 在城市发展的进程中,地形地貌始终是影响规划决策的关键因素,而坡度作为表征地表倾斜程度的核心指标,更是贯穿于城市建设、生态保护等诸多环节。本文将全面解读中国 371 个城市坡度数据的相关情况,包括数据概况、生成流程、应用场景等内容,为读者呈现一份详尽的坡度数据指南。 阅读详情

相关推荐

STM32F407 FreeRTOS+LVGL移植实战:从驱动适配到性能优化

本文详细介绍了在STM32F407开发板上移植FreeRTOS和LVGL的实战经验,涵盖硬件准备、驱动适配、性能优化等关键步骤。通过TFTLCD屏幕驱动优化、DMA加速和任务优先级调整,显著提升界面流畅度,为嵌入式GUI开发提供实用解决方案。

weixin_29190651的博客 635

位运算

位运算中设计到的操作有:与、或、非、异或、左移、右移。题目一:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数,例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2。 分析: 1.将给定的整数右移,并且判断每一次右移之后最低位是否为1. 2.设置一个flag,每次将flag左移,判断给定的整数每一位是否为1. 3.将一个数与它减一相与,会将这个数最右边的1变为0.

_Findway的博客 263

010Editor实战:5分钟破解Zip伪加密文件(附BUUCTF真题解析)

本文详细介绍了如何使用010Editor快速破解Zip伪加密文件,包括BUUCTF真题的完整解析。通过修改关键字节,轻松解除伪加密状态,适用于CTF竞赛和实际工作场景,提升文件处理效率。

weixin_29325007的博客 326

java递归调用实例 迷宫

java递归调用实例 迷宫

weixin_46365586的博客 765

Halcon 简单的形状匹配定位与区域跟随

【代码】Halcon简单的形状匹配定位与区域跟随。

唐大狗 2806

Unity集成阿里Qwen2.5-Omni全模态大模型实战:语音交互与多模态AI开发指南

本文详细介绍了在Unity中集成阿里Qwen2.5-Omni全模态大模型的实战指南。通过C#脚本开发,实现语音交互、图像分析等多模态AI功能,涵盖API调用、音频处理、流式响应解析等核心步骤,为游戏、虚拟人等Unity应用提供沉浸式智能交互解决方案。

weixin_29005499的博客 316

C语言中常见库函数编写(占坑)

strcpy函数:如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案: 2分 void strcpy( char *strDest, char *strSrc ) { while( (*strDest++ = * strSrc++) != ‘\0’ ); }4分 void strcpy( char *strDest, const char *strSrc ) //将

_Findway的博客 484

从源码编译CesiumForUnreal

从源码编译CesiumForUnreal插件

专注GIS开发 5644

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...

qq_14989799的博客 186

【unity实战】Unity2D TileMap的探究(最简单,最全面的TileMap使用介绍)

之前有人在微信上找我,问了TileMap相关的知识【unity实战】随机地下城生成2——绘制地图Tilemap的使用及一些技巧的使用(含源码)不过写的不是特别不是特别细致,只是简单的用了一下,所有这次特地打算单独写一篇文章,来介绍一下,下次还有人问我,我直接就把这篇文章丢给他,完美!Unity的Tilemap 一般称之为瓦片地图或者平铺地图,是 Unity2017 中新增的功能,主要用于快速编辑 2D 游戏中的场景,通过复用资源的形式提升地图多样性。Tilemap是一个用于创建2D地图的工具。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

国科大学习资料--矩阵论(叶世伟)-期末考试题整理3

国科大学习资料–矩阵论-期末考试题整理3 国科大学习资料–矩阵论-期末考试题整理3 国科大学习资料–矩阵论-期末考试题整理3

无名何许人的博客 1406

hdu2612 Find a way

原文链接: hdu2612 Find a way 上...

阿豪 161

【VTKExamples::Meshes】第十二期 QuadricDecimation

本文分享VTK样例QuadricDecimation,并解析接口vtkQuadricDecimation,希望对各位小伙伴有所帮助!

qq_40041064的博客 344

使用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(...

weixin_42365198的博客 159

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

delphiwcdj的专栏 6167

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

HDU 2612 find a way

跑两遍BFS,开数组记录到达KFC步数。

大咸鱼。。。 2366

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

木槿花非花的博客 971

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...

weixin_33786077的博客 128

【简单搜索】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...

Mark_Eleven的学习笔记 497

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

菜鸟的程序人生 3819
上一篇: perror
下一篇: CentOS 7 的安装教程
Codelee1995
博客等级 码龄12年 3粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值