(水)POJ-3083 按规定方向遍历方法

poj 3083解题报告 poj 3083解题报告poj 3083解题报告poj 3083解题报告poj 3083解题报告 立即下载

题目大意:给一个图,需求3个解,第一个和第二个分别为按照一定原则走到E的步数,规则为规定人有一个面向,第一个答案为依次按左前右后遍历所需步数,第二个为依次按右前左后遍历所需步数,其中前后左右都是以当前面向为参考系。第三个解为最短路。下面给出求第一个解时的走法的实例:


我用0,1,2,3分别来代表西,北,东,南。假设我们从3的位置走到了当前位置,那么面向肯定是朝向1即朝向北方的,此时我们的左,前,右,后分别指的是0,1,2,3方向。

题目链接:点击打开链接

分析:我们在dfs时可以用一个参数q记下当前的面向,然后按照相对于当前面向q的4个方向左前右上遍历便行了。具体方法请看代码,有注释。

附上代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#define INF 0x3f3f3f3f3f
#define judge(x,y) a[x][y]=='.'&&!vis[x][y]
struct point{ int x, y; point(int a = 0, int b = 0){ x = a, y = b; } };
using namespace std;
char a[45][45];
int d[45][45];
bool vis[45][45];
int _move[4][2] = { { 0, -1 }, { -1, 0 }, { 0, 1 }, { 1, 0 } };
int n, m, ans1, ans2, ans3;
int sx, sy;
int ex, ey;
int dfs(int x,int y,int q,int kase)   //q为当前面向,kase为第一种或者第二种走法的特定的值,当执行左优先走法时kase为3,右优先走法时为1,具体分析请往下看
{
	if (x == ex&&y == ey) return 1;
	int res = 0;
	for (int i = q + kase; i < q + kase + 4 * (4 - kase); i += 4 - kase)  //这里我们只分析左优先走法,右优先读者请自行分析。当左优先走法时,若当前面向为q,则(q+3)%4即为当前面向的左面,读者请根据图中给出的方向想一想为什么。左优先时当尝试完上一种方向i时,则下一种方向为i+1。
	{
		int fx = x + _move[i % 4][0], fy = y + _move[i % 4][1];
		if (judge(fx, fy))
		{
			res = dfs(fx, fy, i % 4, kase) + 1;
			break;
		}
	}
	return res;
}
int bfs()   //bfs求最短路,dfs会超时
{
	d[sx][sy] = 0;
	queue<point> q;
	q.push(point(sx, sy));
	vis[sx][sy] = 1;
	while (!q.empty())
	{
		point v = q.front();
		q.pop();
		for (int i = 0; i < 4; i++)
		{
			int fx = v.x + _move[i][0], fy = v.y + _move[i][1];
			if (judge(fx, fy))
			{
				q.push(point(fx, fy));
				d[fx][fy] = d[v.x][v.y] + 1;
				if (fx == ex&&fy == ey) return d[fx][fy];
				vis[fx][fy] = 1;
			}
		}
	}
	return 0;
}
int main()
{
	int T;
	scanf("%d", &T);
	while (T--)
	{
		memset(d, 0x3f3f3f3f, sizeof d);
		memset(a, false, sizeof a);
		memset(vis, false, sizeof vis);
		scanf("%d%d", &m, &n);
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= m; j++)
			{
				cin >> a[i][j];
				if (a[i][j] == 'S') { sx = i, sy = j; }
				if (a[i][j] == 'E') { ex = i, ey = j; a[i][j] = '.'; }
			}
		int q;
		if (sx == 1) q = 3;      //确认处于S处的初始面向
		else if (sx == n) q = 1;
		else if (sy == 1) q = 2;
		else q = 0;   
		ans1 = dfs(sx, sy, q, 3);
		ans2 = dfs(sx, sy, q, 1);
		ans3 = bfs() + 1;      //+1的原因为结果一共经历过哪些地方,包括起点,而不是走了多少步
		printf("%d %d %d\n", ans1, ans2, ans3);
	}
	return 0;
}


Apple 网页 SRP 登录系列文章(四):Hashcash 工作量证明与完整登录流程 本文是Apple SRP登录系列文章的收官之作,重点解析了Apple独有的Hashcash工作量证明机制并展示了完整的登录流程实现。文章详细介绍了Hashcash的安全目的、格式标准、计算核心算法及难度评估方法,特别提供了Python实现代码。同时还讲解了如何动态获取服务器Hashcash参数以及建立容错机制。最后呈现了完整的Apple SRP登录主函数架构,为开发者提供了从理论到实践的全面指导。全文通过代码示例和流程分析,系统性地阐述了Apple安全登录机制的技术细节。 阅读详情

相关推荐

永磁同步电机定子槽型设计实战:从梨形槽到矩形槽的NVH优化之路

本文深入探讨了永磁同步电机定子槽型设计在NVH优化中的关键作用,对比了梨形槽与矩形槽的性能差异。通过Ansys Maxwell仿真和实际案例,揭示了矩形槽在提升槽满率、降低电磁噪声方面的优势,并总结了五大设计黄金法则,为电机设计工程师提供了实用指导。

weixin_28740299的博客 493

POJ 3083(DFS+BFS)

题目链接:http://poj.org/problem?id=3083 题意:给出一个迷宫,s为qdi

To be excellent! 396

stm32H743基于CubeMX配置为双ADC多通道DMA规则采样

stm32H743的ADC支持的最大频率为36MHz,有相关资料上说是可以超频,具体技术细节不多讨论。 需求: 使用stm32H743的ADC采集5路ovrc

xtqbp的博客 4363

poj3083

这道题目结合了深搜和广搜,利用

小小小小杜 706

【SpringBoot 4.x 第29节】Spring Security 7 入门:先理解认证和授权!

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。本专栏面向 有一定 Java 基础,但尚未系统学习 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,带你从第一个 Hello API 开始,逐步完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 553

小论文/大论文必备 | RT-DETR目标检测、数据集增强 | 引入多种数据集增强方法,支持图像和标签同步扩充增强,助力小论文和大论文实验涨点策略,平均提升模型mAP约1-2个百分点

RT-DETR目标检测数据增强策略研究 ,本文针对RT-DETR目标检测模型提出9种数据增强方法,包括几何变换(水平/垂直翻转、中心裁剪)、光照调整(亮度、对比度)和噪声添加(高斯/椒盐噪声)等。所有增强操作均保持图像与标签同步变换,确保训练数据的准确性。实验表明,该策略可提升模型mAP 1-2个百分点,对小目标检测效果尤为显著。文中提供了完整的Python实现代码,支持批量处理图像和标签文件,并详细说明了各增强方法的功能特点。该方法通过提升数据多样性,有效增强了模型在复杂场景下的鲁棒性和泛化能力。

Ai缝合怪、助力小伙伴高效发论文 460

POJ 3083(按规定方法遍历)

详解:http://blog.youkuaiyun.com/ac_hell/article/details/51097666 #include #include #include #include using namespace std; #define maxn 50 char mp[maxn][maxn]; int n , m; int sx,sy; int ex,ey; int way[4][

favomj的博客 417

uniapp+renderJS+google map开发安卓版APP非小程序

uniapp+renderJS+google map开发安卓版APP非小程序,google map小叉号不显示,google map自定义marker右上角的小叉号如何去掉,uniapp+google map不显示

renkai721的专栏 667

POJ 3083 棋盘问题(DFS+回溯)

题目链接:POJ 1321 棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放

Nova的博客 406

掌握RDMA核心:从同步构建到异步事件的连接艺术

本文深入解析RDMA编程中的双模式设计,揭示同步配置与异步事件机制的协作关系。第一部分阐述同步函数rdma_bind_addr和rdma_listen的本地化角色,强调它们仅完成本地端点配置。第二部分剖析异步事件模型,重点分析连接请求和建立事件的处理流程。通过完整生命周期序列图展示两种模式的交互过程,并提供错误处理、资源管理和性能调优的实用建议。文章指出,理解同步本地配置与异步网络响应这一责任划分,是掌握RDMA编程的关键所在。

数字人生 283

(五)深入理解Bluez协议栈之“GATT Server Profile”

上一篇介绍Bluez协议栈的了GAP Profile的实现,本章节我们继续介绍GATT Profile的实现,参考的程序是Peripheral。通过阅读它的实现代码可以发现,它广播部分是通过mgmt来实现的,然后在初始化完成之后,创建了一个L2CAP类型的socket,来负责实现GATT Server的逻辑。

1142

poj 3083

bfs+dfs 题目要求从起点走到终点,优先左拐需要多少步,优先往右拐需要多少步,最少需要多少步三个结果 需要注意的就是左右不能拐时向其他方向拐的先后顺序 #include #include #include using namespace std; int m,n,x1,x2,y1,y2,cnt,lstep,rstep,ans; char map[50][50]; int mo

pengpeng0927的专栏 507

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

POJ3083

题目连接:http://poj.org/problem?id=3083 题目大意:这是一道有基于图搜索的题目,主要考察两个方面, 一个是DFS搜索图中左优先、右优先的相关路径。 另一个考察点是BFS用于搜索图中最短的路径。 解题报告: 大致的算法步骤如下: 使用DFS思想来解决题目中的左优先、右优先步数计算 使用BFS思想来解决题目中的最短路径步数的计算。 根据本...

weixin_30414635的博客 154

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

POJ-3083 Children of the Candy Corn

题目大意:有一个迷宫,求从起点到终点以三种方式移动(贴左墙走、贴右墙走、最短)的距离 题目链接:http://poj.org/problem?id=3083 贴墙走用DFS,最短路用BFS#include <iostream> #include <stdio.h> #include <string.h> #include <queue>#define MAXN 41using namespace

u011468264的专栏 315

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

POJ——3083(深搜加宽搜的综合应用)

题目链接: http://121.249.217.157:8080/contest/view.action?cid=54#problem/F http://poj.org/problem?id=3083 解析参考:http://blog.youkuaiyun.com/lyy289065406/article/details/6647668 自己的思路:(求左边优先,右边优先

luoshenzhisi 885

POJ3083Children of the Candy Corn

题意:给你一个迷宫,入口处标为S,出口处标为E,可以走的地方为“.”,不可以走的地方为#,求左转优先时从出口到入口的路程,再求右转优先时,出口到入口的路程,最后求从出口到入口的最短路程。 思路:求前两个的时候用DFS递归求解能走的路就OK,求最短的时候当然要用广度优先搜索啦。 1 #include<cstdio> 2 #include<cstring>...

weixin_30677475的博客 141

POJ 3083 Children of the Candy Corn

题目链接:http://poj.org/problem?id=3083 题目分析:

Saber 586

poj解题报告——3083

这题啊,DFS,BFS都用上了不过嘛,这个题意是比较费解的,首先解释输入,给一个w*h的迷宫,其中矩阵里面S是起点,E是终点,而且,S、E都只会在边界并且,不会在角落,例如(0,0),输出的话,每组数据就输出三个整数,第一个整数,指的是,以S的起点为当前所对着的路径为正方向,如果正方向的左边能走的话,就走左边,不能就按正方向走,不行的话就就往回走,如此反复,记录步数,并输出,第二个整数也是如此,只

Lingfu74的专栏 602

poj3083(dfs/bfs混合)

链接:http://acm.hust.edu.cn/vjudge/problem/15200 /* translation: 先沿着左边的墙从 S 一直走,求到达 E 的步数。 再沿着右边的墙从 S 一直走,求到达 E 的步数。 最后求最短路。 solution: 最短路好求。重点是前两步! 很容易想到前两步用简单的dfs就可以求出。但是关键是要“沿着墙壁走”! 观察可以发现规律

林伏案的博客 623

poj 3083 Children of the Candy Corn

Children of the Candy Corn Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7013   Accepted: 3071 Description The cornfield maze is a popular Halloween treat. V

小磊's blog 629

POJ 3083_Children of the Candy Corn

题意: 给定迷宫图,求出一个人从入口进,从出口出,所走过的最短路径以及分别沿着左手边和右手边的墙走出迷宫所走过的方格数。 分析: bfs求最短路 对于沿左右两边的墙走的情况,记录好行走的方向及相对应的左/右边墙的方向坐标 注意判断前方和左/右是否为墙,若前方为墙,则进行逆时针旋转,若左/右方不为墙,则应直接向左/右方向走。 注意考虑前方和左/右边坐标不在迷...

An55511的博客 181

翻转问题(开关,开灯问题)求解技巧

翻转问题技巧详解 例.给定一个01串,现有翻转规则:翻转某一个位置时其后面2个位置也会跟着翻转,也就是每次翻转都会翻转3个连续的位置。要将01串全部翻转为0,求最小的翻转次数 形似这类题的问题叫做翻转问题,也可以叫开关问题,对于这类题通常都会用到下面我要说的方法来解 ①.若某一个位置被翻转了n次,则其实际上被翻转了n%2次,因为翻转2k次相当与没翻转,翻转2k+1次相当于翻转了1次,

越努力越幸运—liupu 7401
上一篇: 翻转问题(开关,开灯问题)求解技巧
下一篇: (水)POJ-2251 三维迷宫
AC_hell
博客等级 码龄11年 65粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值