前言
传送门 :
t
a
g
:
1900
,
思
维
tag :1900,思维
tag:1900,思维
题意
给你一个 n ∗ m n*m n∗m的网格,和一个机器人并且给定他的操作路径 D R D R . . . . DRDR.... DRDR....
你可以进行如下置换操作 D D − > D , R R − > R DD->D,RR->R DD−>D,RR−>R
询问能遍历到的多少个点
思路
首先判断两个不用判断的情况
- 已经走到终点了,显然你再改变一步就不能走到了
- 只走一个方向 , 显然这个答案就是 n n n
否则我们需要找到 开始能操作的点,即出现 D , R D,R D,R的点,然后就开始计算走到了哪里
显然之前一路走的点是不能再回去了 n ∗ n − i d x ∗ n + i d x n*n -idx*n+idx n∗n−idx∗n+idx,但是可以需要加上已经走过的点
然后再减去,已经走远的点,因为只有 D , R D,R D,R操作,走过了就不回不去了
Mycode
void solve(){
int n;cin>>n;
string s;cin>>s;
int x1 = 1,y1 = 1;
int stR = 0 ;
int stD = 0 ;
for(auto x : s){
if(x == 'D') x1++,stD = 1;
else y1++ ,stR = 1;
}
if(x1 == n && y1 == n){
cout<<s.size()+1<<endl;
return;
}
if((stD & stR) == 0){
cout<<n<<endl;
return;
}
int idx = 1;
while(s[idx] == s[idx-1]) ++idx;
//找到可以开始操作的点
int tx = 0 ;
int ty = 0 ;
for(int i=idx;i<(int)s.size(); i ++ ){
if(s[i] == 'R') tx++;
else ty++;
}//上面回不去了
//所有点 - 必然走不到的点
//一条路走到黑的点 已经 走过的点
cout<<n*n - tx*ty - idx*n + idx<<endl;
}
signed main(){
int t;cin>>t;while(t--)
solve();
return 0 ;
}