[UVa 816] Abbott 的复仇(Abbott's Revenge)

UVa 816 Abbott的复仇 (Abbott's Revenge) 有一个最多包含9*9个交叉点的迷宫。输入起点,离开起点时的朝向和终点,求一条最短路(多解输出任意一个均可) 这个迷宫的特殊之处在于,进入一个交叉点的方向(用NEWS这四个字母分别表示北东西南,即上右左下)不同,允许出去的方向也不同。例如, 1 2 WLF NR ER * 表示交叉点(1,2)有三个路标,最后一个字符是结束标志,如果进入该点的方向是W,出去只能是L左转和F前进,其他同理。 要点: ... 阅读详情

Judge:https://vjudge.net/problem/UVA-816
题意:一个迷宫,每个点限制了从哪一方向(东西南北)来的,只能往左右前走,然后问起点到终点的最短路径。


比较难的一道迷宫题,要保存每个点所能走的方向。

特别注意的一点,路径可能有环形,这会影响到输出。

#include <iostream>
#include <string>
#include <cstdio>
#include <queue>
using namespace std;

#define DIR_EAST	0
#define DIR_NORTH	1
#define DIR_WEST	2
#define DIR_SOUTH	3

const char c_strDir[5] = "ENWS";
const int c_iX[4] = { 1, 0, -1, 0 };
const int c_iY[4] = { 0, -1, 0, 1 };

struct SPoint {
	SPoint() : x(0), y(0), iDir(0) {}
	SPoint(int iInX, int iInY, int iInDir) : x(iInX), y(iInY), iDir(iInDir) {}
	
	int x, y;
	int iDir;
	
	bool operator == (int i) { if (i == 0) return x == 0 && y == 0; }
	bool operator == (SPoint ptB) { return x == ptB.x && y == ptB.y; }
};

// [y][x][Direction][Turn]
bool g_arrMap[10][10][4][4];
SPoint g_arrPrev[10][10][4];

int GetDirection(char chDir)
{
	for (int i = 1; i <= 4; i++)
		if (c_strDir[i - 1] == chDir)
			return i - 1;
	return -1;
}

int TurnToDir(int iDir, char chTurn)
{
	if (chTurn == 'L')
		return (iDir + 1) % 4;
	else if (chTurn == 'R')
		return (iDir + 4 - 1) % 4;
	else
		return iDir;
}

SPoint GetNextStep(SPoint pt, int iDir)
{
	return SPoint(pt.x + c_iX[iDir], pt.y + c_iY[iDir], iDir);
}

SPoint Search(SPoint ptStart, SPoint ptEnd)
{
	SPoint pt = GetNextStep(ptStart, ptStart.iDir), ptNext;
	g_arrPrev[pt.y][pt.x][pt.iDir] = ptStart;
	
	queue<SPoint> theQueue;
	theQueue.push(pt);
	while (!theQueue.empty())
	{
		pt = theQueue.front();
		theQueue.pop();
		
		if (pt == ptEnd)
			return pt;
		
		for (int i = 0; i <= 3; i++)
		{
			if (g_arrMap[pt.y][pt.x][pt.iDir][i])
			{
				ptNext = GetNextStep(pt, i);
				if (ptNext.y >= 1 && ptNext.y <= 9 &&
					ptNext.x >= 1 && ptNext.x <= 9 &&
					g_arrPrev[ptNext.y][ptNext.x][ptNext.iDir] == 0)
				{
					g_arrPrev[ptNext.y][ptNext.x][ptNext.iDir] = pt;
					theQueue.push(ptNext);
				}
			}
		}
	}
	
	return SPoint(-1, -1, -1);
}

int g_iPrintCnt = 0;
void Print(SPoint pt)
{
	if (pt == SPoint(-1, -1, -1))
	{
		cout << "  No Solution Possible";
		cout << endl;
		return;
	}
	
	if (!(g_arrPrev[pt.y][pt.x][pt.iDir] == 0))
	{
		SPoint ptNext = g_arrPrev[pt.y][pt.x][pt.iDir];
		g_arrPrev[pt.y][pt.x][pt.iDir] = SPoint(0, 0, 0);
		Print(ptNext);
	}
	
	if (!g_iPrintCnt)
		cout << " ";
	g_iPrintCnt++;
	printf(" (%d,%d)", pt.y, pt.x);
	if (g_iPrintCnt == 10)
	{
		g_iPrintCnt = 0;
		cout << endl;
	}
}

#define DEBUG

int main()
{
	#ifndef DEBUG
		freopen("in.txt", "r", stdin);
		freopen("out.txt", "w", stdout);
	#endif

	string strTitle;
	SPoint ptStart, ptEnd;
	
	while (cin >> strTitle, strTitle != "END")
	{
		for (int i = 0; i < 10; i++)
			for (int j = 0; j < 10; j++)
				for (int m = 0; m < 4; m++)
					for (int n = 0; n < 4; n++)
						g_arrMap[i][j][m][n] = 0;
		for (int i = 0; i < 10; i++)
			for (int j = 0; j < 10; j++)
				for (int m = 0; m < 4; m++)
					g_arrPrev[i][j][m] = SPoint(0, 0, 0);
		g_iPrintCnt = 0;
		
		cin >> ptStart.y >> ptStart.x;
		char chTmp;
		cin >> chTmp;
		cin >> ptEnd.y >> ptEnd.x;
		ptStart.iDir = GetDirection(chTmp);
		
		SPoint ptTmp;
		while (cin >> ptTmp.y, ptTmp.y)
		{
			cin >> ptTmp.x;
			
			char chDir, iDir, chTurn;
			getchar();
			while (chDir = getchar(), chDir != '*')
			{
				iDir = GetDirection(chDir);
				while (chTurn = getchar(), chTurn != ' ')
					g_arrMap[ptTmp.y][ptTmp.x][iDir][TurnToDir(iDir, chTurn)] = true;
			}
		}
		
		cout << strTitle << endl;
		Print(Search(ptStart, ptEnd));
		if (g_iPrintCnt)
			cout << endl;
	}
	
	#ifndef DEBUG
		fclose(stdin);
		fclose(stdout);
	#endif
	
	return 0;
}


UVa816 例题 6-14 Abbott的复仇 (Abbott's Revenge,ACM/ICPC World Finals 2000) 原题链接: UVa-816 题目大意:  模有一个最多包含9*9个交叉点的迷宫。输入起点、离开起点时的朝向和终点,求一条最短路径。(具体题目参考原题和紫书) 解题思路:  本题是一道用BFS求最短路径的迷宫题。不过和普通的迷宫不太一样,该题加了一个朝向和转向的概念。可以想象成十字路口修路,限制道路前进方向(不太准确)。这道题看的时候完全没有思路,虽然写过用BFS求解迷宫的问题,但是想了 阅读详情

相关推荐

功率半导体器件选型指南:从GTO、GTR到MOSFET、IGBT的原理与应用

功率半导体器件是电力电子系统的核心,如同电路中的智能开关,负责电能的转换与控制。其工作原理基于半导体材料的导电特性,通过控制信号精确管理电路的通断。这类器件的技术价值在于提升能效、减小体积并增强系统可靠性,广泛应用于变频器、逆变器、开关电源及新能源领域。理解不同器件如MOSFET的雪崩能量与IGBT的损耗计算,是进行高效、可靠电路设计的基础。本文聚焦于GTO、GTR、MOSFET和IGBT这四类经典全控型器件的特性对比与选型策略,帮助工程师在具体项目中做出经济可靠的选择。

cumo7370的博客 447

例题:Abbott的复仇(UVa 816)

有一个最多包含9*9个交叉点的迷宫。输入起点、离开起点时的朝向和终点,求一条最短路(多解时任意输出一个即可) 这个迷宫的特殊之处在于:进入一个交叉点的方向(用NEWS这四个字母分别表示北东西南,即上下左右)不同,允许出去的方向也不同。例如,12 WLF NR ER*表示交叉点(1,2)(上数第一行,左数第二列)有3个路标(字符“*”只是结束标志),如果进入交叉点时的朝向为W(即朝左),则可以左转

Ethan的博客 922

Python-Opencv中的膨胀和腐蚀

Python-Opencv中的膨胀和腐蚀 腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。 膨胀就是图像中的高亮部分进行膨胀,“邻域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中高亮部分被腐蚀,“邻域被蚕食”,效果图拥有比原图更小的高亮区域。 1.膨胀 膨胀过程是有一个结构元素或者模板去在原图像素比对,当比对过程中,中心像素位置的值根据其八邻域取或运算,或运算为1就取自己的中心值,...

qq_44262417的博客 1万+

Abbott的复仇(Abbott's Revenge)ACM/ICPC WF2000

Abbott's Revenge Time limit: 3.000 seconds      The 1999 World FinalsContest included a problem based on a “dicemaze.” At the time the problem was written, the judges were unable todiscover the

Sturling的博客 1602

【实战】——零代码玩转Supervisely人像分割:从标注到模型训练的数据流水线搭建

本文详细介绍了如何零代码使用Supervisely平台搭建人像分割数据流水线,从智能标注到数据集格式转换,再到模型训练与优化。Supervisely的智能标注工具和协作功能大幅提升了人像分割项目的效率,特别适合视频会议背景虚化、虚拟试衣等应用场景。

weixin_30694389的博客 416

UE4 专用服务器搭建(UE4.27为例)

专用服务器、DS服务器

mimo134的博客 2775

Abbott的复仇(Abbott's Revenge)BFS算法实现

The questionThe 1999 World FinalsContest included a problem based on a “dicemaze.” At the time the problem was written, the judges were unable todiscover the original source of the dice maze concept. S

XXX 3340

CEH Practical 实战考试真题与答案

CEH Practical 是 EC-Council 推出的Certified Ethical Hacker(CEH)认证项目中的一项高级动手实践考试。它不同于传统的理论考试,侧重于在真实环境中检验考生的实操能力。

sgafdgdagd的博客 968

UVA816 Abbott的复仇 Abbott's Revenge

以此纪念一道用四天时间完结的题 敲了好几次代码的出错点:(以下均为正确做法) memset初始化 真正的出发位置必须找出。 转换东西南北的数组要从0开始。 bfs没有初始化第一个d 是否到达要在刚刚取出队首时就判断,因为可能真正的起点和终点是一个。 要判断v.x,v.y都是否在1~9之间。 打印No Solution Possible前要空两格? ...

weixin_30498807的博客 95

C# WinForm项目目录结构详解:从入门到精通(附常见问题解决方案)

本文详细解析了C# WinForm项目目录结构,从解决方案与项目基础结构到核心文件功能,再到关键目录解析,帮助开发者快速掌握WinForm项目组织方式。文章还提供了常见问题解决方案,如引用丢失、配置文件不生效等,是WinForm开发从入门到精通的实用指南。

dream的博客 647

YOLO11改进 - 卷积Conv | StripBlockStripBlock大条带卷积块,通过顺序条带卷积捕获方向性长程依赖,强化高长宽比目标特征提取 | AAAI 2026

本文介绍了面向高纵横比目标检测的条带卷积模块——StripBlock,适用于遥感、船只、车道等细长结构目标的特征增强。该方法先通过 `5×5` 深度卷积提取局部空间信息,再利用 `1×19` 与 `19×1` 的正交长条卷积分别建模横向和纵向长程依赖,最后通过 `1×1` 卷积生成空间注意力权重,并以逐元素门控方式重标定输入特征。我们将 StripBlock 成功集成进 YOLO11,在检测头的多尺度特征层中引入条带式空间建模能力,从而增强模型对细长目标和复杂遥感场景的定位与识别效果。

魔改工程师的博客 234

UVA816 Abbott的复仇 Abbott's Revenge (bfs)

题目传送 bfs找迷宫最短路,不过比传统迷宫问题多了方向,所以加一维就行。 被UVA的输出格式搞崩了心态。。。(默默吐槽一下) 详见代码注释: #include <iostream> #include <string> #include <cstring> #include <queue> #include <vector> using ...

Crush_Z 270

Python实现稳态传热传质的偏微分方程求解

通过这种方法,我们可以求解更复杂的传热传质问题,并对系统的温度和浓度分布进行分析和优化。稳态传热传质是一个重要的工程问题,涉及到物质在空间中的分布以及热量和质量的传递。每次迭代中,我们使用上一次迭代的温度值来计算下一次迭代的温度值。该图显示了平板内部各点的温度分布,其中中心温度为T1,边界温度为T2。接下来,我们创建一个N x N的温度矩阵,并将边界条件初始化为边界温度T2。假设我们有一个矩形平板,其中心温度为T1,四个边界温度为T2。假设平板的长度为L,宽度为W,中心温度为T1,边界温度为T2。

HackDashX的博客 308

UVA816 Abbott的复仇 Abbott's Revenge(完善紫书代码)

一、写在前面 紫书上的代码没有给全,缺省了输入函数和一些定义,自己补全了一下,同时加了一些注释。反复修改,交上去终于对了。 Tip1:输出格式很坑 Tip2:读入很麻烦,所以最好写完读入函数之后,试验一下,再写后面的。免得最后如果出错了很难找错。自己写完读入函数之后,试验过程中就改出了不少错误。 二、代码及注释 #include<iostream> #include<cstrin...

numb_ac的博客 374

老版QQ原生表情gif动态

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

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

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

Abbott 的复仇(Abbott's Revenge,ACM|IPPC World Finals 2000, UVa 816)

//算法竞赛入门经典中一道经典的用BFS求最短路径例题 //2015/01/30 #include #include #include #include #include using namespace std; typedef struct node //结点数据 { node(){} node(int row,int col,int d):r(row),c(col),dir(d){}

Doarcutine的专栏 1483

精雕软件(JDpaint) 5.5 绿色版

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

Abbott的复仇 Abbott's Revenge UVA816

题目描述 输入格式 输出格式 题意翻译 给出一个箭头迷宫,在每个路口处,如果你从某个方向进入了该路口,那么路口的地面上在靠近你的方向会画有一组箭头,它们相对于你的方向可以是向左,向前,向右,或者是它们的任意组合。 当你从某一方向进入某个入口时,下一步只能在这个入口对应方向上标记的箭头中选一个方向继续行进。在起点时,可以选择任何方向。 给出起点和终点,求它们之间的最短路径。 每条边的长度...

老顽固也可爱 143

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

UVA816 Abbott的复仇 Abbott's Revenge(final的BFS)(真•答案)

写这道题差点没把我气死,网上的好多题解看了半天结果是假的… 题目PDF 【分析】 利用队列实现广度搜索BFS来遍历图寻找最短路径。 用一个三元组(r, c, dir)表示“位于(r, c),面朝dir”这个状态。假设入口位置为(r0, c0),朝向为dir,则初始状态并不是(r0, c0, dir),而是(r1, c1, dir),其中,(r1, c1)是(r0, c0)沿着方向d...

繁凡さん的博客 615

例题6-14 Abbott的复仇(Abbott's Revenge, ACM/ICPC World Finals 2000, UVa816)

原题链接:https://vjudge.net/problem/UVA-816 分类:图 备注:图的最短路(BFS) 前段时间已经做过一些BFS了,做这个就看了看紫书上的翻译,比较关键的是看了下怎么存储路径,大概懂了就很容易了。 代码如下: #include<string> #include<cstdio> #include<vector> #include&l...

TK_wang_的博客 422

例题6-14 Abbott的复仇(Abbott's Revenge, ACM/ICPC World Finals 2000, UVa 816)

思路: 我所了解的BFS,建图然后遍历。这题在建图上与我所认识的BFS有所不同。 他给出的是起点及移动方向,并且由到某点时的方向可以确定起点,所以存图方式为存点的状态。 还有要注意的就是方向与转向的实现。建完图之后,与普通的BFS并无大不同。#include #include #include #include #include #include #include #inclu

%%% 821

Abbott的复仇(Abbott's Revenge, ACM/ICPC World Finals 2000, UVa 816)<经典BFS>

the reason of failure:1、各种坑坑洼洼的修改。2、在第一个dir上,已经将其转换为数字了,就不该在计算时又转换一次 how to solve:对着正确的一遍又一遍找错误,最后自己不看答案完整写出 question: where is difficult: key point:1、BFS的使用方法。2、strchr的使用 (const char *

yeleng的博客 1100

[UVA] Abbott's Revenge

题目:https://vjudge.net/problem/UVA-816 #include<iostream> #include<vector> #include<string> #include <sstream> #include<queue> #pragma warning(disable:4996) using names...

weixin_37992828的博客 190

Abbott的复仇(Abbott's Revenge)

题目链接:https://uva.onlinejudge.org/external/8/816.pdf 紫书:P165 题意: 有一个最多包含9*9个交叉点的迷宫。输入起点、离开起点时的朝向和终点,求一条最短路(多解时任意输出一个即可)。   【分析】        利用队列实现广度搜索BFS来遍历图寻找最短路径。        用一个三元组(r, c, dir)表示“位于(r, c...

qq_41009449的博客 440
下一篇: [UVa 673] 平衡的括号(Parentheses Balance)
StarlitNight
博客等级 码龄9年 1粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值