hdoj 1180 搜索 + bfs + 优先队列

2024-04-06 00:08
文章标签 搜索 bfs 队列 优先 hdoj 1180

本文主要是介绍hdoj 1180 搜索 + bfs + 优先队列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目


#include<iostream>
#include<queue>
#define MAX 22
#include<string.h>
using namespace std;struct Node{int x, y, s;friend bool operator<(const Node &a, const Node &b){return a.s > b.s;}
};int vis[MAX][MAX];
char c;
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int n, m;
int sx, sy;
char map[MAX][MAX];
int check(int x, int y){if(x>=0 && x<n && y>=0 && y<m && !vis[x][y] && map[x][y]!='*')return 1;return 0;	
}
Node t1, t2, node;
int bfs(int x, int y){priority_queue<Node> pq;node.x = x; node.y = y; node.s = 0;pq.push(node);vis[node.x][node.y] = 1;//标记已经访问while(!pq.empty()){t1 = pq.top();pq.pop();if(map[t1.x][t1.y] == 'T') return t1.s;//if(map[t2.x][t2.y] == 'T') return t2.s;for(int i = 0; i < 4; ++i){int nx = t1.x + dir[i][0];int ny = t1.y + dir[i][1];if(!check(nx,ny)) continue;t2.x = nx; t2.y = ny; t2.s = t1.s+1;//下一位置是楼梯时候才考虑 否则正常走 //有楼梯时*********************************if(map[nx][ny] == '|' || map[nx][ny] == '-'){if(t2.s%2 == 0){ //这里为偶数步时候 其之前一步的楼梯应该反向  if(map[nx][ny] == '|')c = '-';else if(map[nx][ny] == '-')c = '|';	}elsec = map[nx][ny];t2.x += dir[i][0];t2.y += dir[i][1];if(!check(t2.x,t2.y)) continue;if(c == '|' && (dir[i][1] == 1 || dir[i][1] == -1) || c == '-'&& (dir[i][0] == 1 || dir[i][0] == -1)){t2.s += 1;//c表示到达楼梯前一步时候楼梯所处的状态			}			//如果人沿着x(上下)走 楼梯横着 等待//人沿着y(左右)走 楼梯 竖着等待 }//***********************************	vis[t2.x][t2.y] = 1;pq.push(t2);}	}//end OF while return -1;	
}int main(){while(scanf("%d%d",&n,&m)!=EOF){for(int i = 0; i < n; ++i){for(int j = 0; j < m; ++j){cin >> map[i][j];if(map[i][j] == 'S'){sx = i; sy = j; }}}memset(vis,0,sizeof(vis));int ans = bfs(sx, sy);printf("%d\n",ans);}	return 0;}

这篇关于hdoj 1180 搜索 + bfs + 优先队列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/878522

相关文章

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque