Vladik and Favorite Game CodeForces

来源:互联网 发布:美丽说网络兼职客服 编辑:程序博客网 时间:2024/06/08 01:29

传送门:CodeForces - 811D

题意:给定n*m的图,你输出一个方向之后,系统反馈给你一个坐标,表示走完这步之后到的位子,问怎样走能在在2*n*m步之内走到终点。

起点是(1,1),终点是'F',‘*’表示不能走,游戏开始的时候,可能将U和D互换,即如果我们操作了U,但是实际是走到了D。L和R同理。


思路:看完题意就被吓到了,这是什么鬼题,特别是还有fflush这种没见过的东西。但是看完题解就被蠢到了,什么破题啊。。


先bfs记录路径,然后每一步输出正确的走法,根据反馈来确定是否有操作被调换了。

#include<bits/stdc++.h>#define ll long long#define fi first#define se second#define pi acos(-1)#define inf 0x3f3f3f3f#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define rep(i,x,n) for(int i=x;i<n;i++)#define per(i,n,x) for(int i=n;i>=x;i--)using namespace std;typedef pair<int,int>P;const int MAXN=100010;int gcd(int a,int b){return b?gcd(b,a%b):a;}char mp[110][110];int n,m;P pre[110][110],path[10010];bool book[110][110];int go[4][2]={1,0,0,1,-1,0,0,-1};char dir[5]="DRUL";queue<P>q;P bfs(){P u,v;book[1][1]=1;q.push(P(1,1));pre[1][1]=P(-1,-1);while(!q.empty()){u=q.front();q.pop();if(mp[u.fi][u.se]=='F')return u;for(int i=0;i<4;i++){v.fi=u.fi+go[i][0];v.se=u.se+go[i][1];if(v.fi<1||v.se<1||v.fi>n||v.se>m)continue;if(mp[v.fi][v.se]=='*')continue;if(!book[v.fi][v.se]){book[v.fi][v.se]=1;pre[v.fi][v.se]=u;q.push(v);}}}}int main(){std::ios::sync_with_stdio(0);int r,c;cin>>n>>m;for(int i=1;i<=n;i++)cin>>(mp[i]+1);P t=bfs();int cnt=0;while(t!=P(-1,-1)){path[cnt++]=t;t=pre[t.fi][t.se];}cnt--;P u,v;while(cnt>0){int d;u=path[cnt];v=path[cnt-1];for(int i=0;i<4;i++)if(u.fi+go[i][0]==v.fi&&u.se+go[i][1]==v.se){d=i;break;}cout<<dir[d]<<endl;//fflush(stdout);cin>>r>>c;if(P(r,c)!=v){if(d==0||d==2)swap(dir[0],dir[2]);else swap(dir[1],dir[3]);}elsecnt--;} return 0;}



原创粉丝点击