HDU 1026 Ignatius and the Princess I

yolov7目标追踪:基于自定义数据集完成检测 目标追踪包含两个阶段:(1)基于自定义数据集,训练yolo目标检测模型;(2)基于检测模型,将实时检测结果传递到StrongSORT追踪算法中,该算法在OSNet基础上结合运动和外观信息,可以跟踪yolo模型检测到的任何物体。 阅读详情

这道题要做到两点:首先是会用bfs遍历图以得到最小时间;另外,难点其实是在于如何确定那条最短路径

所经过的所有点。bfs始终层次遍历,但这样的遍历会遇到一个问题:如果每个点所花费的代价是相同的,

那么如何走并不会影响总时间。可是现在的问题是:代价并不一样。那么就会有这样一个问题:如果还是

按普通的层次遍历,那么同一层上的节点可能会抢占下一层的节点。比如,同为第二层节点的a,b(其代价

分别为6和4),共有一个第三层的节点c,同时访问c都会分别花去a,b一个代价。可是现在如果a先访问,

访问后b将不能再访问。那么c的最小代价就是7了!其实呢,是5。由此可见,同一层次上的节点,如果

有相同的下一层的邻接点则存在“遍历竞争”。解决的办法是利用优先级队列自动将b排在a之前,即使是a

先入队的。

另外一个难题就是记录路径了!得承认这个问题困扰了我很长时间!!刚开始时想用队列记录下节点,然后

再dfs找出这条路。后来想了想,dfs遍历代价可能太大了吧。为哈一直要从前向后找呢?对不对呀。于是乎,

我就用一个坐标点(father_x,father_y)记录下每个节点的来源,也即其father的坐标,那么就可以从最终点出

发,依次向前找father啦。bfs的特点就是一个father(上一层节点)可能有很多child(下一层节点),但一个

child只会有一个father。(一个child被father遍历过,就不会让其他father遍历了)

 

AC代码:

#include<iostream>
#include<queue>
#include<stack>
using namespace std;

const int help[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
char map[100][100];
bool visited[100][100];
int row,col,sum_time;
bool flag;

struct node  //存放访问过的点的信息,自己的位置(x,y),父亲的位置(father_x,father_y)
{
	int x,y,father_x,father_y,time,flag;
	
	friend bool operator < (const node a,const node b)
	{
		return a.time > b.time;
	}
};

priority_queue<node> q1,q2;

void store_map()   //存贮图形
{
	for(int i=0;i<row;i++)
	{
		for(int j=0;j<col;j++)
		{
			cin>>map[i][j];
		}
	}
}

void judge_empty()   //由于q1,q2都是全局的,在每次使用之前都要清空
{
	while(!q1.empty())
		q1.pop();
	while(!q2.empty())
		q2.pop();
}

void bfs()
{
	judge_empty();   //清空后使用

	memset(visited,false,sizeof(visited));
	visited[0][0]=true;
	node start;   //初始化队列,头结点入队
	start.x=start.y=start.time=start.flag=start.father_x=start.father_y=0;
	q1.push(start);
	
	flag=false;   //标志是否达到(row-1,col-1)
	sum_time=0;   //记录总共用去的最小时间
	node tmp1,tmp2;
	while(!q1.empty() && !flag)
	{
		tmp1=q1.top();
		q1.pop();
		q2.push(tmp1);   //每次从q1中出对的点都要进入q2中,因为这每个点都要可能是路径上的点
		
		for(int k=0;k<4;k++)
		{
			int xx=tmp1.x+help[k][0];
			int yy=tmp1.y+help[k][1];
			
			if(xx>=0 && xx<row && yy>=0 && yy<col && !visited[xx][yy])  //在图形范围内,并没有访问过的点,可以访问
			{
				visited[xx][yy]=true;

				if(xx==row-1 && yy==col-1)
				{
					tmp2.x=xx;
					tmp2.y=yy;
					tmp2.father_x=tmp1.x;
					tmp2.father_y=tmp1.y;
					if(map[xx][yy]=='.')
					{
						tmp2.time=tmp1.time+1;
						tmp2.flag=0;
					}
					else
					{
						tmp2.time=tmp1.time+1+map[xx][yy]-'0';
						tmp2.flag=map[xx][yy]-'0';
					}
					q1.push(tmp2);
					flag=true;
					sum_time=tmp2.time;

					if(flag)    //这个最终点要在这里入q2队列
						q2.push(tmp2);
				}
				else if(map[xx][yy]=='.')
				{
					tmp2.x=xx;
					tmp2.y=yy;
					tmp2.father_x=tmp1.x;
					tmp2.father_y=tmp1.y;
					tmp2.time=tmp1.time+1;
					tmp2.flag=0;
					q1.push(tmp2);
				}
				else if(map[xx][yy]>='1' && map[xx][yy]<='9')
				{
					tmp2.x=xx;
					tmp2.y=yy;
					tmp2.father_x=tmp1.x;
					tmp2.father_y=tmp1.y;
					tmp2.time=tmp1.time+1+map[xx][yy]-'0';
					tmp2.flag=map[xx][yy]-'0';
					q1.push(tmp2);
				}
			}
		}
	}
}

void help_output()  //辅助输出,目的就是将q2中在路径上的点找出来,从最最终节点一直向前找其父亲节点
{
	stack<node> s;
	while(!q2.empty())
	{
		s.push(q2.top());
		q2.pop();
	}


	node tmp,tmp1;
	tmp1=s.top();
	q2.push(tmp1);
	s.pop();
	while(!s.empty())
	{
		tmp=s.top();
		s.pop();
		if(tmp1.father_x==tmp.x && tmp1.father_y==tmp.y)
		{
			tmp1.father_x=tmp.father_x;
			tmp1.father_y=tmp.father_y;
			q2.push(tmp);
		}			
	}
}



void output()   //按要求输出
{
	if(flag)
	{
        help_output();

		cout<<"It takes "<<sum_time<<" seconds to reach the target position, let me show you the way."<<endl;
		
		int Time=1;
		node temp1,temp2;
		temp1=q2.top();
		q2.pop();

		while(!q2.empty())
		{
			temp2=q2.top();
			q2.pop();
			
			cout<<Time++<<"s:("<<temp1.x<<","<<temp1.y<<")"<<"->("<<temp2.x<<","<<temp2.y<<")"<<endl;
			if(temp2.flag)
			{
				for(int i=0;i<temp2.flag;i++)
					cout<<Time++<<"s:FIGHT AT "<<"("<<temp2.x<<","<<temp2.y<<")"<<endl;
			}
			
			if(temp2.x==row-1 && temp2.y==col-1)
				break;
			else
			{
				temp1.x=temp2.x;
				temp1.y=temp2.y;
			}
		}
	}
	else
		cout<<"God please help our poor hero."<<endl;

	cout<<"FINISH"<<endl;
}

int main()
{
	while(cin>>row>>col)
	{
		store_map();

		bfs();

        output();
	}

	return 0;
}


 

人工智能面试总结-分类与聚类 目录说说常用的分类算法,以及各自的优缺点?说说为什么正确率有时不能有效评估分类算法?说说什么样的分类器最好?说说聚类算法有哪些衡量标准?(选看)各聚类算法性能比较汇总说说什么是聚类,你知道哪些聚类算法?具体展开介绍你知道的聚类算法?说说K-Means聚类算法流程?说说K-Means聚类算法如何调优?说说K-Means聚类算法如何选择初始点?说说K-Means聚类聚的是特征还是样本?说说K-Means聚类的特征距离是如何计算的?说说聚类与分类的区别?手撕K-Means聚类 说说常用的分类算法,以及各自的优缺点 阅读详情

相关推荐

通过FlinkCDC将MySQL中变更的数据写入到kafka(DataStream方式)

文章目录前言一、CDC的种类?二、通过FlinkCDC将数据从MySQL导入到Kafka1.核心代码2.工具类3.可能会出现的错误及解决解决: 前言 CDC的Change Data Capture(变更数据捕获)的缩写 FlinkCDC的核心思想是监测并捕获数据库的变动(包括数据或数据表的插入、更新以及删除等),将这些变更按发生的顺序完整记录下来,写入到消息中间件中以供其他服务进行订阅及消费。 一、CDC的种类? CDC 主要分为基于查询和基于 Binlog 两种方式,简述两者的区别:

不会打球的摄影师不是好程序员 9622

hdu 1026 Ignatius and the Princess I

hdu   1026   Ignatius and the Princess I                 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1026 题目大意:经典二维迷宫问题,魔王、公主与勇士的故事,这不是魔塔么???!!! 题目分析:又是要求输出路径的BFS,还打小怪兽,不过不怕,poj3984打印过路径,hdu1242也

slicer的技术交流栈 825

Logisim实战:手把手教你设计硬布线版MIPS CPU(多周期/8指令/附电路图)

本文是一份详细的Logisim实战指南,手把手教你设计一个采用硬布线控制的多周期MIPS CPU。文章深入剖析了硬布线控制与微程序控制的核心理念差异,并逐步讲解了从定义执行状态、构建状态跳转逻辑到生成控制信号、集成测试的完整流程,最终实现一个支持8条指令、可运行简单程序的处理器模型。

g9h0i1的博客 592

HDU1026——Ignatius and the Princess I,HDU1027——Ignatius and the Princess II,HDU1028——Ignatius and the

a矩阵:存储迷宫的信息,其中X表示障碍物,表示空地,数字1-9表示需要战斗的格子。flag矩阵:标记格子是否已被访问过。d数组:定义了四个移动方向。node结构体:包含坐标y和x,以及到达该格子的步数step。pre数组:用于记录每个格子的前一个格子,以便回溯路径。

u014114223的博客 2101

告别天价授权!手把手教你用TwinCAT 3.1搭建EtherCAT主站(Windows 10/11保姆级教程)

本文详细介绍了如何在Windows 10/11系统上使用TwinCAT 3.1免费搭建EtherCAT主站,帮助中小企业和个人开发者低成本实现工业自动化。从环境准备、许可证策略到安装配置和实战开发,提供保姆级教程,涵盖PLC编程、运动控制及硬件选型建议,助您轻松入门工业控制领域。

weixin_30664615的博客 363

STM32基于软件模拟IIC进行AHT21B温湿度采集

通过学习软件IIC来进行实操AHT21B采集温湿度。

Liu-FE的博客 3700

hdu 1026 Ignatius and the Princess I

hdu 1026 Ignatius and the Princess I         题目要求的是从(0, 0)到(n-1, m-1)的最小秒数啦, 首先想到的就是广搜啦, 这道题要求输出搜索过的路径哦, 那么就需要一个额外的数组来记录了.         用turn[][]数组来记录每次转过的方向, 一次广搜结束后, 然后再从终点顺着走回来, 就可完成路径的记录啦. #incl

happen_zhang 616

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

算法如诗的博客 155

HDU1026 Ignatius and the Princess I

问题链接:HDU1026 Ignatius and the Princess I。 题意简述:从矩阵的左上角走到右下角所需的最短时间,并且要求输出走的过程。矩阵中"."是可以走的,"X"是墙,n(数字1-9)是怪兽,需要战斗数字所示的时间。对于每个测试实例,先输入n和m,分别表示行数和列数,然后输入矩阵。 问题分析:显然求最短路径问题用BFS,另外由于有怪兽...

weixin_33904756的博客 92

[UVM]UVM TLM2.0简介及应用实例分析

本文介绍了TLM2.0在UVM中的实现与应用。TLM2.0作为SystemC模型间的核心传输机制,相比TLM1.0提供了更丰富的特性,包括双向阻塞/非阻塞接口、时间标记和统一数据包。文章详细解析了TLM2.0在UVM中的接口实现方式,包括socket类型定义、数据传输机制以及时间标记处理。通过一个具体实例,展示了如何在UVM组件中使用TLM2.0的initiator和target socket进行数据传输,并说明了标准数据包格式和精确时间标记的优势。最后指出TLM2.0在UVM中的实现主要是为了与Syste

元直的博客 5398

2小时用Trae搭建全功能CMS系统

在前文中,我们使用Trae从零搭建了一个用户文档站点,仅用不到2小时就实现了用户注册登录和文档的增删改查功能,且无需编写任何代码。本节我们将在此基础上,构建一个CMS后台管理系统,包含用户管理和文档管理两大功能模块。

2501_92019101的博客 540

HDU 1026 Ignatius and the Princess I

题目链接:传送门 Problem Description The Princess has been abducted by the BEelzebub feng5166, our hero Ignatius has to rescue our pretty Princess. Now he gets into feng5166's castle. The castle is a large ...

贾作真时真亦贾的博客 275

使用modelscope加载报错:ImportError: cannot import name ‘AutoTokenizer’ from ‘modelscope’...如何解决?| 提供多种解决方案

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1245

hdu 1026 Ignatius and the Princess I题解

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1026 菜鸟第一发。。。 题目大意:给出一张n*m的图,'.'表示道路,'X'表示不能通过的地方,数字n表示怪物的血量(打死需要花费n秒),每走一步需花费一秒,只能往上下左右四个方向走。要求找出从(0, 0)点到(n-1, m-1)点用时最短的路径,并按照样例把路径输出来。 思路:用bfs寻找

pai_pk的博客 334

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

HDU - 1026 Ignatius and the Princess I

The Princess has been abducted by the BEelzebub feng5166, our hero Ignatius has to rescue our pretty Princess. Now he gets into feng5166's castle. The castle is a large labyrinth. To make the problem ...

vocaloid01的博客 305

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

HDU1026——Ignatius and the Princess I

先看题目。 Problem Description The Princess has been abducted by theBEelzebub feng5166, our hero Ignatius has to rescue our pretty Princess. Now hegets into feng5166's castle. The castle is a large labyr

a054545641的博客 378

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

hdu 1026 Ignatius and the Princess I

题目链接 Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14047    Accepted Submission(s): 4422 Special Judge

大太阳 819

HDU 1026 Ignatius and the Princess I BFS 优先队列

Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18557    Accepted Submission(s): 5976 Special Judge Problem

LZK1997的博客 888

HDU 1026 Ignatius and the Princess I

Ignatius and the Princess I                                                                       Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)              

Houheshuai的专栏 507

HDU OJ 1026 Ignatius and the Princess I 【搜索+记录路径】

原题连接:http://acm.hdu.edu.cn/showproblem.php?pid=1026 题意: 给一个 n * m 的矩阵,X 代表墙 . 代表路,若是数字 ,则该点有 怪,需要 打怪。从求 从(0,0 )点 到  (n-1,m-1)点的用时最小的路,要输出路径。 思路:1:求用时最小路----BFS(广搜)+ 优先队列;             2:在搜到一个点时对应记

nyist_飘谊 2671

HDU1026:Ignatius and the Princess I

点击打开题目链接 Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8688    Accepted Submission(s): 2590 Special J

I just want to AC you~~~ 1127
上一篇: HDU 2964 Prime Bases
下一篇: HDU 2674 N! Again
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值