题意:交互式问题。 n*m 的图,'F'为终点,'.'为路,'*'为墙,一开始人在点(1,1),要走到 'F' 。 你可以操控人走,但左右和上下可能会交换,即你操控走左边,有可能是走向右边。 题目保证只在一开始会交换方向。
你操控人走向哪边,会返回下一个点的坐标给你。
tags: SB题,就是先 bfs 记录下来,再走一遍就是了。 但这题主要写起来有点烦。。
// 811D #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second #define PII pair<int, int > typedef long long ll; const int N = 105; int n, m; PII f[N][N]; bool vis[N][N]; char s[N][N]; int xx[4]={0,0,1,-1}, yy[4]={-1,1,0,0}; void bfs(int x, int y) { queue<PII > q; q.push(MP(x,y)); vis[x][y]=true; while(!q.empty()) { PII u=q.front(), to; q.pop(); rep(i,0,3) { to.fi=u.fi+xx[i], to.se=u.se+yy[i]; if(to.fi>0 && to.se>0 && to.fi<=n && to.se<=m) if(!vis[to.fi][to.se] && s[to.fi][to.se]=='.') { vis[to.fi][to.se]=true; f[to.fi][to.se]=u; q.push(to); } } } } char ch[5]={'#', 'L', 'R', 'U', 'D' }; int Dir(int x1, int y1, int x2, int y2) { if(x1-1==x2 && y1==y2) return 3; if(x1+1==x2 && y1==y2) return 4; if(x1==x2 && y1+1==y2) return 2; if(x1==x2 && y1-1==y2) return 1; } bool lr, ud; int Rev(int flag) { if(flag==1) return 2; if(flag==2) return 1; if(flag==3) return 4; if(flag==4) return 3; } int fx, fy; void solve(int x, int y) { if(x==fx && y==fy) return ; int tx, ty, x2=f[x][y].fi, y2=f[x][y].se; int flag = Dir(x, y, x2, y2), flag2 = Rev(flag); printf("%c ", ch[flag]); fflush(stdout); scanf("%d%d", &tx, &ty); if(tx!=x2 || ty!=y2) { if(tx!=x || ty!=y) { printf("%c ", ch[flag2]); fflush(stdout); scanf("%d%d", &tx, &ty); } if(flag==1 || flag==2) swap(ch[1], ch[2]); if(flag==3 || flag==4) swap(ch[3], ch[4]); } solve(tx, ty); } int main() { scanf("%d%d", &n, &m); rep(i,1,n) { scanf("%s", s[i]+1); rep(j,1,m) if(s[i][j]=='F') fx=i, fy=j; } bfs(fx, fy); solve(1, 1); return 0; }