1.题目描述
小a在玩一个很简单的游戏,游戏的内容是控制一个小人在一块矩形的空地内走,一旦小人走出矩阵范围,游戏就失败。游戏机有上,下,左,右四个按键,每按一下小人就向相应的方向走一步。这个游戏过于简单,小a说:“这种游戏我闭着眼睛玩都输不了”。于是他便闭上眼睛,进行一连串的操作。但若他中途输了的话就会停止。
那么问题来了:给定小a的操作,进行Q次询问,你能算出每次询问小人能走多少步吗?
- 输入描述:
第一行为长度L
的字符串S
,每个字符依次代表小a的一次操作。'u'
代表向上,'d'
代表向下,'l'
代表向左,'r'
代表向右。字符串S
不会包含其他字符。
第二行是整数Q
,代表Q
次询问
接下来Q
行,每行有四个整数N
,M
,X
,Y
,保证1<=X<=N
,1<=Y<=M
,矩阵大小为N*M
,小人初始位置为(X,Y)
。
对于30%的测试,0<X<=1000
,0<Y<=1000
,0<L<=1000
,0<Q<=1000
对于100%的测试,0<X<=100000(1e5)
,0<Y<=100000(1e5)
,0<L<=100000(1e5)
,0<Q<=30000(3e4)
- 输出描述:
每次询问要求你打印一个整数s
(单独一行),代表小人所走的步数。 - 备注:
小人踏出矩阵外的那一步也要算入结果哦 - 输入示例:
uuurrdddddl 3 5 6 3 3 5 6 4 2 6 6 4 2
- 输出示例:
3 10 11
- 说明:
上下左右关系以下图为例,一个N=3,M=2的矩阵是这样的:
(1,1)(1,2)
(2,1)(2,2)
(3,1)(3,2)
2.题目解析
简单遍历判断是否出了矩阵即可。
3.参考答案
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int q = 0;
scanf("%d",&q);
int nums[q][4];
for(int i=0;i<q;++i){
int n = 0;
int m = 0;
int x = 0;
int y = 0;
scanf("%d%d%d%d",&n,&m,&x,&y);
nums[i][0] = n;
nums[i][1] = m;
nums[i][2] = x;
nums[i][3] = y;
// scanf("%d%d%d%d",&nums[i][0],&nums[i][1],&nums[i][2],&nums[i][3]);
}
for(int i=0;i<q;++i){
int count = 0;
for(int j=0;j<s.size();++j){
if(s[j] == 'u'){
--nums[i][2];
++count;
if(0 == nums[i][2]){
break;
}
} else if(s[j] == 'd'){
++nums[i][2];
++count;
if(nums[i][0]+1 == nums[i][2]){
break;
}
} else if(s[j] == 'r'){
++nums[i][3];
++count;
if(nums[i][1]+1 == nums[i][3]){
break;
}
} else if(s[j] == 'l'){
--nums[i][3];
++count;
if(0 == nums[i][3]){
break;
}
}
}
printf("%d\n",count);
}
return 0;
}
其他写法
#include <iostream>
#include <cstdio>
using namespace std;
int check(string const& str,int nums[4]){
int cur_n = nums[2];
int cur_m = nums[3];
int step = 0;
for(int i=0;i!=str.size();++i){
++step;
switch(str[i]){
case 'u':
--cur_n;
if(cur_n<1) return step;
break;
case 'd':
++cur_n;
if(cur_n>nums[0]) return step;
break;
case 'r':
++cur_m;
if(cur_m>nums[1]) return step;
break;
case 'l':
--cur_m;
if(cur_m<1) return step;
break;
}
}
return step;
}
int main(){
string str; // 操作
cin >> str;
int n;
scanf("%d",&n);
int res[n];
for(int i=0;i!=n;++i){
int nums[4];
for(int j=0;j!=4;++j){
scanf("%d",&nums[j]);
}
// 记录检测结果
res[i] = check(str,nums);
}
// 打印结果
for(int i=0;i!=n;++i){
printf("%d\n",res[i]);
}
}