下笔春蚕食叶声。

题解 CF294D 【Shaass and Painter Robot】

题意简述

给厨房的n行m列瓷砖上色。初始时在\((X_s,Y_s)\)上。\(Shaass\)希望厨房瓷砖最后像棋盘一样黑白相间。即:没有两块相邻瓷砖颜色相同。

机器人有"UL"左上,"UR"右上,"DL"左下,"DR"右下四种移动方式,
当它撞墙时会遵循【光的反射】原则反弹。

每当机器人移动到一块瓷砖上,它就给这块瓷砖上色(所以可能重复多次上色)

输出机器人的步数,当机器人不能完成任务,输出-1.

分析

很有趣的题目 由此推出我不会做

显然,对于第二行,如果第一行已经黑白间隔地填好,则第二行一定已经填好。原因是穿进穿出时,第一行的黑格的左下格和右下格已经涂黑。

由此推出,如果边界全部黑白相间的填好,则一定已经填完。

那么要涂多少边界呢?

举几个例子 按照奇偶性分类看一下,是 \(n+m-2\)

接着,我们只需要暴力计算每次到边缘格的时候在那块瓷砖就行了。

这个不用多说。快 乐 的 思 维 题

code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define per(i,x,y) for(int i=x;i>=y;i--)
#define rd(x) scanf("%d",&x);
typedef long long LL;
int n,m,x,y,cnt;
long long ans;
string str;
map<pair<int,int>,int>vis;
int main(){
	rd(n);rd(m);rd(x);rd(y);
	cin>>str;
	int dx,dy;
	(str[0]=='U')?dx=-1:dx=1;
	(str[1]=='L')?dy=-1:dy=1;
	cnt=0;int tim=0;
	if(x==1||x==n||y==1||y==m) cnt++,vis[make_pair(x,y)]=1;
	while(cnt!=n+m-2){
		if(++tim>=500000)  {puts("-1");return 0;}
		int tx,ty;
		if(dx==1) tx=abs(n-x);else tx=abs(1-x);
		if(dy==1) ty=abs(m-y);else ty=abs(1-y);
		int tmp=min(tx,ty);
		x+=dx*tmp;y+=dy*tmp;ans+=tmp;
		if(x==1) dx=1;if(x==n) dx=-1;
		if(y==1) dy=1;if(y==m) dy=-1;
		if(!vis[make_pair(x,y)]) cnt++,vis[make_pair(x,y)]=1;
	}
	cout<<ans+1<<endl;
	return 0;
}

注意点

1.本题那个边缘那个好难想到qaq

2.不可以边界重复走就输出-1!会过不去样例的!

3.当心int溢出

posted @ 2020-10-27 08:25  ACwisher  阅读(178)  评论(0编辑  收藏  举报