TOJ3973传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3973

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte
总提交: 198            测试通过:52

描述

The maze is the same as problem D, and I strongly recommend you solve the previous one first because it.s easier than this.

This time, we want you design the command for our poor robot to move from where it is to its destination. The command sequence.s length should be the shortest. If several solutions exist, find the lexicographically minimum one.

Lexicographical sequence is the order in one dictionary. For example, “cat” is less than “do”, and “do” is less than “dog”.

输入

The first line contains a single integer T, indicating the number of test cases.

Each test case begins with one integer N (1 <= N <= 50), indicating the size of the maze. The followed N lines are N strings whose length is also N, indicating the maze.

输出 

For each case, output a command string if there is a solution, otherwise output -1.

样例输入

2
2
S.
#T
4
S#..
.#T.
.##.
....

样例输出

RD
DDDRRRUUL

思路:入门广搜,从S出发到T,如果找得到路径输出字典序最小的那条,找不到则输出-1,可以在结构体内封装一个string属性,在向四个方向搜索的时候,加上对应字的母即可。本题有个小细节是,需要输出的是字典序最小的路径,这点区别于TOJ3128(简单版贪吃蛇),可以在写方向数组的时候,按四个方向的字典序从小到大写,int go[4][2] = {1,0,0,-1,0,1,-1,0}; 这样就可以在找到T的时候直接输出字符串。

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<queue>
#include<set>
#include<map> 
#include<vector>
#define LL long long
#include<assert.h>
using namespace std;
int go[4][2] = {1,0,0,-1,0,1,-1,0};
char ma[100][100];
int vis[100][100];
struct note{
    int x,y;
    string s;
}pos,q;
int n;
int check(int x,int y){
    if(x < 0 ||x >= n || y < 0 || y >= n)return 0;
    return 1;
}
void bfs(int x,int y,int ex,int ey){
    string str[1000];
    int ans = 0;
    vis[x][y] = 1;
    queue<note>que;
    pos.s = "";
    pos.x = x;
    pos.y = y;
    que.push(pos);
    while(que.size()){
        q = que.front();
        que.pop();
        if(q.x == ex && q.y == ey){
            cout<<q.s<<endl;return;
        }
        for(int i = 0 ; i < 4 ; i++){
            int dx = q.x + go[i][0];
            int dy = q.y + go[i][1];
            if(check(dx,dy) && !vis[dx][dy] && ma[dx][dy] != '#'){
                //cout<<q.s<<endl;
                pos.x = dx;
                pos.y = dy;
                if(i == 0) pos.s = q.s + "D";
                if(i == 1) pos.s = q.s + "L";
                if(i == 2) pos.s = q.s + "R";
                if(i == 3) pos.s = q.s + "U";
                que.push(pos);
                vis[dx][dy] = 1;
            }
        }
    }
    puts("-1");
    return;
}
int main(){
    int t;
    for(scanf("%d",&t);t--;){
        int sx,sy,ex,ey;
        memset(vis,0,sizeof(vis));
        scanf("%d",&n);
        for(int i = 0 ; i < n ; i++){
            scanf("%s",ma[i]);
            for(int j = 0 ; j < n ;j ++){
                if(ma[i][j] == 'S'){
                    sx = i;sy = j;
                }
                if(ma[i][j] == 'T'){
                    ex = i;ey = j;
                }
            }
        }
        bfs(sx,sy,ex,ey);
    }
}
View Code

相关文章: