题意:说有四个按钮 L,R可能是反的,U,D可能是反的,然后对于你每次输出的(L,R,U,D),会返回一个坐标,到达给定的F 的位置停止。
分析:关键就是判断L,R 是否是反的,U,D 是否是反的,刚开始的位置是(1,1),贴墙的,为了防止走到 * 上,我们可以找一个右边是空的位置,然后输出一个L,如果在原地,那么说明 不反,如果到了右边,说明反了,对于U,D 也同样,知道反没反之后就是当前位置到目标位置的bfs了,将路径存下来,按照是否相反进行输出。
以下是代码:
char mp[105][105];
bool vis[105][105];
pii pre[105][105];
int n, m, x, y;
int tomove[4][2] = { { 0,-1 },{ 0,1 },{ -1,0 },{ 1,0 } };
bool judge(int x, int y) {
if (x<1 || x>n || y<1 || y>m || vis[x][y] || mp[x][y] == '*')return false;
else return true;
}
void bfs(int posx, int posy) {
queue<pii>qe;
qe.push(pii(posx, posy));
vis[posx][posy] = 1;
while (!qe.empty())
{
pii now = qe.front(); qe.pop();
if (now.first == x && now.second == y) break;
for (int i = 0; i < 4; ++i) {
int fx = now.first + tomove[i][0], fy = now.second + tomove[i][1];
if (judge(fx, fy)) {
pre[fx][fy] = now;
vis[fx][fy] = 1;
qe.push(pii(fx, fy));
}
}
}
}
int main() {
memset(vis, 0, sizeof(vis));
bool f1 = 0, f2 = 0;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) {
getchar();
for (int j = 1; j <= m; ++j) {
scanf("%c", &mp[i][j]);
if (mp[i][j] == 'F')x = i, y = j;
}
}
if (x == 1 && y == 1) {
return 0;
}
int px = 1, py = 1, a, b;
if (mp[px][py + 1] == '.') {
printf("L\n");
cin >> a >> b;
if (mp[a][b] == 'F')return 0;
if (a == px && b == py)f1 = 0;
else f1 = 1;
if (f1) {
printf("R\n");
cin >> a >> b;
}
px = a, py = b;
if (mp[px][py] == 'F')return 0;
while (mp[px + 1][py] == '*') {
if (f1) {
printf("L\n");
cin >> a >> b;
px = a, py = b;
}
else {
printf("R\n");
cin >> a >> b;
px = a, py = b;
}
if (mp[px][py] == 'F')return 0;
}
printf("U\n");
cin >> a >> b;
if (a == px && b == py)f2 = 0;
else f2 = 1;
if (mp[px][py] == 'F')return 0;
if (f2) {
printf("D\n");
cin >> a >> b;
px = a, py = b;
}
}
else
{
printf("U\n");
cin >> a >> b;
if (mp[a][b] == 'F')return 0;
if (a == px && b == py)f2 = 0;
else f2 = 1;
if (f2) {
printf("D\n");
cin >> a >> b;
}
px = a, py = b;
if (mp[px][py] == 'F')return 0;
while (mp[px][py + 1] == '*') {
if (f2) {
printf("U\n");
cin >> a >> b;
px = a, py = b;
}
else {
printf("D\n");
cin >> a >> b;
px = a, py = b;
}
if (mp[px][py] == 'F')return 0;
}
printf("L\n");
cin >> a >> b;
if (a == px && b == py)f1 = 0;
else f1 = 1;
if (mp[px][py] == 'F')return 0;
if (f1) {
printf("R\n");
cin >> a >> b;
px = a, py = b;
}
}
bfs(px, py);
int nowx = x, nowy = y;
stack<char>st;
while (nowx != px || nowy != py) {
for (int i = 0; i < 4; ++i) {
if (pre[nowx][nowy].first + tomove[i][0] == nowx
&& pre[nowx][nowy].second + tomove[i][1] == nowy) {
int tmpx = pre[nowx][nowy].first, tmpy = pre[nowx][nowy].second;
nowx = tmpx, nowy = tmpy;
if (i == 0)st.push('L');
else if (i == 1)st.push('R');
else if (i == 2)st.push('U');
else st.push('D');
break;
}
}
}
while (!st.empty()) {
if (st.top() == 'U') {
if (f2)printf("D\n");
else printf("U\n");
}
else if (st.top() == 'D') {
if (f2)printf("U\n");
else printf("D\n");
}
else if (st.top() == 'L') {
if (f1)printf("R\n");
else printf("L\n");
}
else {
if (f1)printf("L\n");
else printf("R\n");
}
cin >> a >> b;
st.pop();
}
}