UVa816 Abbott's Revenge

uva816 -- Abbott's Revenge (BFS) 题目在此 这一题是求最短路,肯定是使用BFS来求解,然而这一题我的AC过程很不顺利,起初是迷之Runtime Error,我以为是输出的时候采用递归导致栈溢出,改成循环后还是RE,后来不知道改了什么,终于不RE了,又开始了无限Wrong Answer,还好最后找出了WA的原因:是我对输入理解有误导致的,比如题目给出的测试迷宫SAMPLE中,有这样的一组数据:1 2 WLF NR ER * ,我起 阅读详情

        题意:走迷宫,在某个点,对于某个当前前进方向,只能往左、右、前三个方向中的某些方向走。

        思路:BFS。因为即使在同一个点,当前前进方向不同,能走的方向也不同,所以把一个点拆成四个来BFS,把每个点的前驱存起来,然后递归输出解即可。点的位置方向信息可以映射到一个整数,这样做比较方便。


#include <iostream>         
#include <stdio.h>         
#include <cmath>         
#include <algorithm>         
#include <iomanip>         
#include <cstdlib>         
#include <string>         
#include <memory.h>         
#include <vector>         
#include <queue>         
#include <stack>         
#include <map>       
#include <set>       
#include <ctype.h>         
#define INF 1000000010     
#define ll long long     
#define max3(a,b,c) max(a,max(b,c))     
#define MAXN 1000

using namespace std;     

string name;
int vis[4010];
int path[4010];
int cnt;

inline int char2int(char ch) {
	if(ch=='E'||ch=='F')return 0;
	if(ch=='S'||ch=='L')return 1;
	if(ch=='W'||ch=='R')return 2;
	if(ch=='N')return 3;
	return -1;
}

inline int hash(int r,int c,int dir){
	return r*40+c*4+dir;
}

inline void dehash(int n,int& r,int& c,int& dir){
	dir=n%4;
	n/=4;
	c=n%10;
	n/=10;
	r=n;
}

vector<int> data[10][10][5];

void print(int n){
	if(n==-1)return;
	print(path[n]);
	int a,b,c;
	dehash(n,a,b,c);
	if(!(cnt%10))printf("\n ");
	printf(" (%d,%d)",a,b);
	cnt++;
}

int main(){
	int startR,startC;
	int goalR,goalC;
	
	while(cin>>name){
		if(name=="END")break;
		memset(vis,0,sizeof(vis));
		memset(path,-1,sizeof(path));
		memset(data,0,sizeof(data));
		cnt=0;
		
		char ch;
		cin>>startR>>startC>>ch>>goalR>>goalC;
		data[startR][startC][char2int(ch)].push_back(0);
		
		int r,c;
		while(cin>>r){
			if(r==0)break;
			cin>>c;
			string str;
			while(cin>>str){
				if(str=="*")break;
				int dir=char2int(str[0]);
				
				for(int i=1;i<str.size();i++){
					data[r][c][dir].push_back( char2int(str[i]) );
				}
			}
		}
		
		bool ok=false;
		int end;
		int start=hash(startR,startC,char2int(ch));
		queue<int> que; que.push( start );
		vis[start]=1;
		int test=0;
		while(!que.empty()){
			
			int cur=que.front(); que.pop();
			int curR,curC,curD;
			
			dehash(cur,curR,curC,curD);
		
			if(curR==goalR&&curC==goalC&&test){
				ok=true;
				end=cur;
				break;
			}
			test++;
			for(int i=0;i<data[curR][curC][curD].size();i++){
				int tmpD;
				if(data[curR][curC][curD][i]==0){
					tmpD=curD;
				}
				if(data[curR][curC][curD][i]==1){
					tmpD=(curD+3)%4;
				}
				if(data[curR][curC][curD][i]==2){
					tmpD=(curD+1)%4;
				}
				
				int nn;
				if(tmpD==0){
					nn=hash(curR,curC+1,tmpD);
				}else if(tmpD==1){
					nn=hash(curR+1,curC,tmpD);
				}else if(tmpD==2){
					nn=hash(curR,curC-1,tmpD);
				}else if(tmpD==3){
					nn=hash(curR-1,curC,tmpD);
				}
				if(!vis[nn]){
					vis[nn]=true;
					que.push(nn);
					path[nn]=cur;
				}
			}
		}
		
		cout<<name;
		if(ok){
			print(end);
			printf("\n");
		}else{
			printf("\n  No Solution Possible\n");
		}
	}
	return 0;
}


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

相关推荐

告别转换超时!手把手教你用Allegro2Altium.bat搞定AD21导入Allegro 17.2文件

本文详细介绍了如何使用Allegro2Altium.bat工具解决AD21导入Allegro 17.2文件时的转换超时问题。通过理解转换机制、准备离线环境、执行完整转换流程及高级技巧,帮助工程师高效完成PCB设计文件转换,提升工作效率。

weixin_30378623的博客 421

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

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

StarlitNight的博客 596

单细胞分析进阶:sctransform标准化在Seurat中的实战解析

本文深入解析了sctransform标准化方法在Seurat单细胞分析中的实战应用。通过对比传统对数标准化,sctransform能更有效地建模并剔除技术噪音,提升数据质量。文章提供了从环境配置、数据准备、核心参数解析到完整流程整合的详细指南,并针对常见问题给出解决方案,帮助研究者获得更清晰的细胞分群和更可靠的差异表达结果。

weixin_29248313的博客 151

例题:Abbott的复仇(UVa 816)

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

Ethan的博客 922

2026年4月AI爆发周:阿里连推三款模型、字节全双工语音上线,国内大模型进入“落地竞速“新阶段

**摘要:**2026年4月初,国内AI大模型迎来密集发布,阿里、字节、腾讯分别推出新产品。阿里一周发布三款模型,覆盖通用推理、多模态轻量化和长文档处理,API价格大幅下降;字节推出全双工语音模型,实现实时交互,技术难度高;腾讯混元3.0强调工程化和生态整合,面向企业私有化部署。趋势显示,行业从性能竞赛转向落地竞赛,多模态成为主战场,API成本降低,开发者选择更丰富。国内大模型竞争重点转向实际应用和生态整合。

weixin_45526015的博客 1万+

《唤醒你的AI同事:WorkBuddy从零上手》000:介绍及目录

《唤醒你的AI同事:WorkBuddy从零上手》全书导览与总目录:000–043 共 44 篇,覆盖从环境搭建、对话基础到资料库、行业助手与多模态生成的入门实战。含完整篇目速查与编号直达,建议关注收藏。

LuckyHanMo的博客 598

uva816(迷宫最短路径困难版)

题面 在刘汝佳紫书p165 题意 给一个迷宫,告诉起点和终点坐标,但是和平时做的迷宫不一样,不是每个点都能走上下左右4个方向,规定了进入点的方向和从该点走出的方向(比如从北方进入a点能从a点向左或者向右转,但是从东方进入a点就只能直走),求从起点到终点的最短走法 思路 看到题目必然是bfs求最短路,但是这一堆条件把我搞懵了,用了半天才吃透这个题,首先,我们肯定要记录每个点的状态,行,列,朝向,转向,是否走过,距出发点距离,该点的父亲(以便输出结果),将朝北东南西(顺时针)走的坐标变化用二维数组表示,用一个函

tczz000的博客 447

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(五级)答案 + 解析

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(五级)答案 + 解析

伶俐角少儿编程 484

uva 816 带方向的bfs

题意: 以下摘自小紫: 给一个9*9的迷宫,输入起点、离开起点时的朝向和终点,求一条最短路。(多解任意输出) 进入一个交叉点的方向(用NEWS这4个字母分别表示北东西南,即上右左下)不同,允许出去的方向也不同。 如图: 解析: 首先弄懂在每个点的状态有哪些:位置(x,y)朝向d,以此来建立节点,并且以此来建立bfs的状态step; 然后是方向dir与转弯turn的转换

渐近自由 612

基于深度学习的水果新鲜程度检测系统(UI界面 + YOLOv8/v7/v6/v5代码 + 训练数据集)

本文详细介绍了如何使用YOLO系列模型(YOLOv5、YOLOv6、YOLOv7、YOLOv8)构建水果新鲜度检测系统。通过数据集准备、模型训练、推理过程以及UI界面的实现,我们能够构建一个实时检测水果新鲜度的系统。通过本博客,您可以全面了解如何应用深度学习技术解决实际问题,尤其是在智能监控和食品质量检测领域。

YOLO 815

NOC总线架构拓扑介绍

在开篇里,我们对芯片PPA有了初步的认识。下面,让我们从访存这个简单的问题开始展开介绍芯片基础概念。CPU是怎样访问内存的?简单的答案是,CPU执行一条访存指令,把读写请求发往内存管理单元。内存管理单元进行虚实转换,把命令发往总线。总线把命令传递给内存控制器,内存控制器再次翻译地址,对相应内存颗粒进行存取。之后,读取的数据或者写入确认按照原路返回。再复杂些,当中插入多级缓存,在每一层缓存都未命中的情况下,访问才会最终达到内存颗粒。

元直的博客 5295

UVA 816 Abbott's Revenge

思路: 来自:https://www.cnblogs.com/acm1314/p/4534360.html 1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #include<queue> 5 using namespace std; 6 7 st...

qq_43119424的博客 129

QGis二次开发 —— 5.1、基于qgis开发雷达扫描、无人机飞行跟踪等(附:源码及工程)

基于qgis开发雷达扫描、无人机飞行跟踪等

324

Abbott's Revenge(UVA816)

Abbott’s Revenge(UVA816) The 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 m...

欢迎交流 261

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

uva 816 - Abbott's Revenge(bfs)

题目链接:uva 816 - Abbott's Revenge bfs,将每个点拆成四个点建图。 #include #include #include #include #include using namespace std; const int maxn = 30; const int dir[4][2] = {{0, -1}, {-1, 0}, {0, 1},

不慌不忙、不急不躁 766

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

uva 816Abbott's Revenge

Description   Abbott’s Revenge  The 1999 World Finals Contest included a problem based on a “dice maze.” At the time the problem was written, the judges were unable to disc

渭城朝雨浥轻尘 1250

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

UVA816-Abbott's Revenge(搜索进阶)

ProblemUVA816-Abbott's Revenge Accept: 1010 Submit: 10466 Time Limit: 3000 mSec Problem Description The 1999 World Finals Contest included a problem based on a dice maze. At the time the...

weixin_30381793的博客 117

Uva-816 - Abbott's Revenge

Input The input file will consist of one or more arrow mazes. The first line of each maze description containsthe name of the maze, which is an alphanumeric string of no more than 20 characters. The

Russian_Blue_Cat的博客 1151

UVA816 Abbott's Revenge

vj上的题目链接:点击打开链接 最近在看刘汝佳的书,这题折腾了很久才理解 #include #include #include #include #include using namespace std; int r0,c0,dir,rs,cs,r2,c2; string mazeName; const char* dirs="NESW"; const char* turns="FLR";

JasonWu的博客 338

UVa 816 Abbott's Revenge【BFS】【迷宫】

https://vjudge.net/problem/UVA-816 分析输入: SAMPLE 3 1 N 3 3 1 1 WL NR * 1 2 WLF NR ER * 1 3 NL ER * 2 1 SL WR NF * 2 2 SL WF ELF * 2 3 SFR EL * 0 WLF的意思是,有个告示牌,从West西方向来的人能看到,他们可以选择向L和F走,也就是左转或者直行。 然后输...

之虎者也的博客 221

Abbott's Revenge UVA - 816

#include &lt;iostream&gt; #include &lt;bits/stdc++.h&gt; #define maxn 11 using namespace std; struct Node { int r,c,dir; Node(int r1,int c1,int dir1):r(r1),c(c1),dir(dir1){} Node(){} }; i...

剑似生平 184

UVA - 816 Abbott's Revenge

原题链接 分析:本题和普通的迷宫在本质上是一样的,但是由于“朝向”也起到了关键作用,所以需要用一个三元组(r,c,dir)表示“位于(r,c),面朝dir”这个状态。假设入口的位置为(r0,c0),朝向为dir,则初始状态并不是(r0,c0,dir),而是(r1,c1,dir),其中,(r1,c1)是(r0,c0)沿着方向dir走一步之后的坐标。此处用d[r][c][dir]表示初始状态

Epsilon 680
上一篇: UVa839 Not so Mobile
下一篇: UVa10305 Ordering Tasks
squee_spoon
博客等级 码龄14年 61粉丝 455原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值