[cf] Educational Codeforces Round 123 E. Expand the Path

前言

传送门 :
t a g : 1900 , 思 维 tag :1900,思维 tag:1900,

题意

给你一个 n ∗ m n*m nm的网格,和一个机器人并且给定他的操作路径 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 nnidxn+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 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值