当前位置: 首页 > article >正文

信息学奥赛一本通 2112:【24CSPJ普及组】地图探险(explore) | 洛谷 P11228 [CSP-J 2024] 地图探险

【题目链接】

ybt 2112:【24CSPJ普及组】地图探险(explore)
洛谷 P11228 [CSP-J 2024] 地图探险

【题目考点】

1. 模拟
2. 二维数组
3. 方向数组

在一个矩阵中,当前位置为(sx, sy),将下一个位置与当前位置横纵坐标的差值记到一个数组中,即为方向数组。
设方向数组dir[4][2]

  • dir[i][0]表示下一步到达位置的行号和当前位置行号的差值
  • dir[i][1]表现下一步到达位置的列号和当前位置列号的差值。

以遍历上下左右四个方向为例:

  • 二维数组写法
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
for(int i = 0; i < 4; ++i)
{
	int x = sx + dir[i][0], y = sy + dir[i][1];
	//(sx,sy)周围的一个新的位置为(x, y)
}

【解题思路】

题目中已经给出了表示方向的方法:整数d表示机器人前进的方向,d = 0 代表向东(右),d = 1 代表向南(下),d = 2 代表向西(左),d = 3 代表向北(上)。向右转操作为d = (d+1)%4

设方向数组dir[4][2]dir[d]表示向整数d代表的方向走一步后,新位置和原位置横纵坐标的差值。
dir[0]表示向右走一步新的位置和当前位置横纵坐标的差值,即dir[0][0]=0, dir[0][1] = 1,或写为dir[0] = {0, 1}
dir[1]表示向下走一步后新的位置和当前位置横纵坐标的差值,dir[1] = {1, 0}
dir[2]表示向左走一步后新的位置和当前位置横纵坐标的差值,dir[2] = {0, -1}
dir[3]表示向上走一步后新的位置和当前位置横纵坐标的差值,dir[3] = {-1, 0}
所以将方向数组声明为int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

设vis数组记录一个位置是否已访问过,设ans记录经过的位置数量。
从起始位置开始一共需要走k步
每走一步前,先通过当前位置和方向数组求出下一个位置的坐标

  • 如果下一个位置在地图范围内,而且是空地,不是障碍,那么可以走到下一个位置
    • 如果下一个位置没有访问过,那么将该位置标记为已访问过,经过的位置数量加1。
    • 如果下一个位置已访问过,则不做事情。
  • 如果下一个位置不是空地,那么进行右转操作。

该题是模拟类问题,题目描述已经足够细致,按照题目描述逐步实现即可。
注意该问题是多组数据问题,处理每组数据前需要清空相关变量,比如vis数组,和ans变量。

【题解代码】

解法1:模拟

#include<bits/stdc++.h>
using namespace std;
#define N 1005
int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};//方向:右下左上 
char mp[N][N];
bool vis[N][N];//vis[i][j]:(i,j)位置是否已访问过 
int main()
{
	int t, n, m, k, sx, sy, d, ans;
	cin >> t;
	while(t--)
	{
		cin >> n >> m >> k >> sx >> sy >> d;//(sx, sy)当前位置 
		for(int i = 1; i <= n; ++i)
			for(int j = 1; j <= m; ++j)
				cin >> mp[i][j];
		memset(vis, 0, sizeof(vis));
		vis[sx][sy] = true;//经过起始位置
		ans = 1;//ans:经过的位置的数量 
		for(int i = 1; i <= k; ++i)//走k步 
		{
			int x = sx+dir[d][0], y = sy+dir[d][1];//(x,y)下一步要走到的位置 
			if(x >= 1 && x <= n && y >= 1 && y <= m && mp[x][y] == '.')//如果(x,y)在地图内,且是空地 
			{
				if(!vis[x][y])
				{
					vis[x][y] = true;
					ans++;
				}
				sx = x, sy = y;
			}
			else
				d = (d+1)%4;//右转 
		}
		cout << ans << endl;
	}
	return 0; 
}

http://www.kler.cn/a/530689.html

相关文章:

  • Python-基于PyQt5,wordcloud,pillow,numpy,os,sys等的智能词云生成器(最终版)
  • 【xdoj-离散线上练习】T251(C++)
  • C语言中的线程本地变量
  • Cubemx文件系统挂载多设备
  • vim的特殊模式-可视化模式
  • [LeetCode]day10 707.设计链表
  • PyQt4学习笔记0】QtGui.QApplication
  • Node 处理客户端不同的请求方法
  • DeepSeek 原理解析:与主流大模型的差异及低算力优势
  • 【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户登录
  • 【数据结构与算法】力扣 5. 最长回文子串
  • [ VS Code 插件开发 ] 使用 Task ( 任务 ) 代替 createTerminal (终端) 来执行命令
  • 数据库和数据表的创建、修改、与删除
  • 冷启动+强化学习:DeepSeek-R1 的原理详解——无需监督数据的推理能力进化之路
  • 基于vue船运物流管理系统设计与实现(源码+数据库+文档)
  • 蓝桥杯学习笔记01
  • 【Qt】常用的容器
  • llama.cpp GGUF 模型格式
  • GWO优化SVM回归预测matlab
  • Mac怎么彻底卸载软件,简单彻底的卸载方式
  • 【数据结构-Trie树】力扣677. 键值映射
  • SQL/Panda映射关系
  • Spring Boot 2 快速教程:WebFlux处理流程(五)
  • 自制虚拟机(C/C++)(三、做成标准GUI Windows软件,扩展指令集,直接支持img软盘)
  • 轮转数组-三次逆置
  • Chromium132 编译指南 - Android 篇(六):从 Linux 版切换到 Android 版