【C题】 Educational Codeforces Round 84 (Rated for Div. 2)

在这里插入图片描述

题意:

给你一个nm的矩阵,给你k个碎片,
第i个碎片在第i行第i列;
你可以对所有碎片进行上下左右等四个操作。
同时如果碎片在边界,且下次操作往往边界移动,则该碎片还停留在原地。
问你能否在2
n*m次操作内将所有的碎片至少一次移动到Petya给他们指定的位置。
输出:先输出你的操作数,再输出你的操作序列。
如果不存在可行的操作的话,就输出 -1

解题思路:

其实题意有点迷惑人,
因为给的条件和问题没太用的到
①第i个碎片在第i行第i列,
②能否在2* n* m次操作内将所有的碎片至少一次移动到Petya给他们指定的位置
③如果不存在可行的操作的话,就输出 -1
这些都挺迷惑人的。

实际上,
可以这么想,
先把所有的碎片向上移(n-1)次,那么所有碎片肯定都在第一行了,然后把所有的碎片向左移动(m-1)次,那么所有的碎片肯定都在第一行第一列。

随后就像这么遍历就好。
在这里插入图片描述
随后遍历整个矩阵,走过所有点,这里的操作次数是多少?
每次左右左右的操作是(m-1)*n次,然后从第一行到最后一行,也就是向下(n-1)次。
最后算算总的操作数
(n-1)+(m-1)+(m-1)*n+(n-1)

=nm+n+m-3

然后比较一下(n+m)与(nm+3)
易得(n+m-3)<(nm)
所以这样的操作肯定是在2nm次操作内,
所以肯定始终存在 2nm次操作内就能走到至少一次指定的位置(指定的位置和刚开始的位置并不重要…)

	cin>>n>>m>>k;
	for(int i=1;i<=2*k;i++){
		cin>>x>>y;
	} //这步一点用的没有,只是为了读入完整
	cout<<n*m+n+m-3<<endl;
	for(int i=1;i<n;i++) cout<<'U';
	for(int i=1;i<m;i++) cout<<'L';
	for(int i=1;i<=n;i++){
		if(i!=1) cout<<'D';
		if(i%2==1){
			for(int j=1;j<m;j++) cout<<'R';
		}else{
			for(int j=1;j<m;j++) cout<<'L';
		}
	}cout<<endl; 
发布了62 篇原创文章 · 获赞 0 · 访问量 647

猜你喜欢

转载自blog.csdn.net/weixin_44745441/article/details/105105651