题解 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溢出
QwQwQ