1 条题解
-
0
📝 题目大意
高桥君从原点 出发,按照字符串 中的指令(R/L/U/D)进行 次移动。判断在移动过程中(包括起点和终点),是否曾到达过同一个坐标两次或以上。
💡 解题思路
-
题目分析:,需要 或 的算法。直接模拟移动过程,并用一个哈希结构记录访问过的坐标即可。关键在于,一共访问了 个位置(起点 + 每次移动后的终点),如果所有位置互不相同,则集合大小应为 ;否则说明有重复访问。
-
算法推导:
- 使用
set<pair<int,int>>(即st)记录所有访问过的坐标。 - 将起点 插入
st,并用pair<int,int> p维护当前位置。 - 遍历字符串 的每个字符
s[i]:'R'→p.first++(向右)'L'→p.first--(向左)'U'→p.second++(向上)'D'→p.second--(向下)- 每次移动后,将新的
p插入st。
- 最终判断:若
st.size() == n + 1,说明所有 个位置均不重复,输出"No";否则输出"Yes"。
- 使用
-
边界与细节:
- 起点 必须插入集合,且需要先插入再开始遍历(代码中
st.insert(p)在循环前执行)。 - 注意输出大小写:
"Yes"/"No"(首字母大写,其余小写)。 - 坐标可能为负数,
pair<int,int>可以正常存储和比较,无需额外处理。 - 使用
set的插入和查找均为 ,unordered_set需要自定义哈希,此处set足够。
- 起点 必须插入集合,且需要先插入再开始遍历(代码中
⏱️ 复杂度分析
- 时间复杂度:,遍历字符串 ,每次
set插入 。 - 空间复杂度:,最坏情况下集合存储 个坐标。
💻 标准代码 (C++)
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; // 使用 set 记录所有访问过的坐标 set<pair<int,int>> st; string s; cin >> s; // 当前位置,初始为原点 (0, 0) pair<int,int> p; p.first = 0; p.second = 0; st.insert(p); // 起点也要记录 for(int i = 0 ; i < n ; i++){ // 根据指令更新坐标 if(s[i] == 'R'){ p.first++; // 右移:x + 1 } else if(s[i] == 'L'){ p.first--; // 左移:x - 1 } else if(s[i] == 'U'){ p.second++; // 上移:y + 1 } else{ p.second--; // 下移:y - 1 } st.insert(p); // 将新位置加入集合 } // 若集合大小等于 N+1,说明所有位置互不相同 if(st.size() == n+1){ cout << "No"; } else{ cout << "Yes"; } } -
- 1
信息
- ID
- 686
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者