Codeforces 294D

294D - Shaass and Painter Robot

思路:

可以用数学归纳法证明一个结论:整个棋盘黑白相间当且仅当边缘黑白相间。

分奇偶讨论又可得出边缘黑色格个数为n+m-2

这样就可以暴力模拟。

数组开不下保存边缘块有没有被访问,可以用map。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))

const int N=1e5+5;
const int INF=0x3f3f3f3f;
map<int,int>mp[N];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int x,y,n,m,dx,dy;
    string s;
    cin>>n>>m>>x>>y;
    cin>>s;
    if(s[0]=='U')dx=-1;
    else dx=1;
    if(s[1]=='L')dy=-1;
    else dy=1;
    int tot=n+m-2;
    int cnt=0;
    ll ans=1;//原来的一格不要忘记
    if(x==1||x==n||y==1||y==m){
            tot--;
            mp[x][y]=1;
    }
    while(true){
        cnt++;
        if(cnt>=5e5)return 0*puts("-1");
        int dis=INF;
        if(dx==1)dis=min(dis,n-x);
        else dis=min(dis,x-1);
        if(dy==1)dis=min(dis,m-y);
        else dis=min(dis,y-1);
        ans+=dis;
        x+=dx*dis;
        y+=dy*dis;
        if(x==1)dx=1;
        else if(x==n)dx=-1;
        if(y==1)dy=1;
        else if(y==m)dy=-1;
        if(!mp[x][y]){
            tot--;
            mp[x][y]=1;
        }
        if(!tot){
            cout<<ans<<endl;
            return 0;
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/widsom/p/8350217.html