[Iroha 2019 Day3 D] おにごっこ 题解
考虑到如果你能看到彩叶并且彩叶快抓到你了,那么你一定就能往另一个方向跑,因为题目限制了迷宫的形态——没有死胡同。
所以如果她能抓到你,必然是迷宫存在一个“视线死角”——你要走到的目标格子旁边,她已经在等着“偷袭”你了——你一过去她就紧接着走过去,然后你就寄了。即考虑如下的例子(其中 ? 可以为 # / . 中的一种):
????
?.#?
?..?
????
你在
避免上面的事情发生是很简单的,那就是你在非必要的情况下就不要动。显然在这种情况下,她不可能偷袭你,因为她到了一个地方并且与你的距离
于是策略就十分明了了——只有在她与自己距离
放代码:
#include<bits/stdc++.h>
using namespace std;
const int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
const string s="DURL";
int main(){
ios::sync_with_stdio(false);
int n; cin>>n;
vector<string> a(n);
for(auto &i:a)cin>>i;
for(int r=0,x=1,y=1,px=-1,py=-1;r<1000;r++){
if(abs(x-px)+abs(y-py)>1)cout<<'-'<<endl;
else{
for(int d=0;d<4;d++){
int xx=x+dx[d],yy=y+dy[d];
if((xx!=px||yy!=py)&&a[xx][yy]!='#'){
x=xx,y=yy,cout<<s[d]<<endl; break;
}
} // 选择一个其他的方向跑路
}
cin>>px>>py,px--,py--;
}
return 0;
}