zoukankan      html  css  js  c++  java
  • 题解 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溢出

  • 相关阅读:
    linux下批量转换文件
    linux的最简socket编程
    war包部署到tomcat
    linux 重命名文件和文件夹
    Thread类的常用方法
    java.lang.Integer.MAX_VALUE;这是什么意思?
    java中 在一个异常处理中什么语句块是可多个的
    oracle条件参数中 IN函数中的值最大只能为1000个
    oracle判断一个字段为空
    javascript 六种数据类型
  • 原文地址:https://www.cnblogs.com/zdsrs060330/p/13882574.html
Copyright © 2011-2022 走看看