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; }