816 - Abbott‘s Revenge (UVA)

题目链接如下:

Online Judge

刘汝佳大佬的代码如下:

uva 816(经典bfs例子)-CSDN博客

有点抽象,但很简洁。

我自己的代码比较臃肿,又臭又长....而且改了很久才AC。暂时没力气写刘汝佳的版本了...我的代码如下:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
// #define debug

struct loc{
    int r, c, prev;
    char direction;
    loc(int _r, int _c, int _prev, char _d): r(_r), c(_c), prev(_prev), direction(_d){}
};
std::string name, direction, str;
int startR, startC, exitR, exitC, r, c, pivot, nextR, nextC;
std::vector<std::string> dir[10][10];
std::vector<std::string> empty;
std::vector<int> path;
std::vector<loc> vec;
bool flag, newloc;
char d, newd;

bool isValid(int u, int v){
    if (u < 1 || u > 9 || v < 1 || v > 9){
        return false;
    }
    return true;
}

void printPath(){
    int p = vec.size() - 1;
    do {
        path.push_back(p);
        p = vec[p].prev;
    } while (p >= 0);
    reverse(path.begin(), path.end());
    for (int i = 0; i < path.size(); ++i){
        printf(" (%d,%d)", vec[path[i]].r, vec[path[i]].c);
        if ((i + 1) % 10 == 0){
            printf("%s", i == path.size() - 1 ? "\n" : "\n ");
        } else if (i == path.size() - 1){
            printf("\n");
        }
    }
}

int main(){
    #ifdef debug
    freopen("0.txt", "r", stdin);
    freopen("1.txt", "w", stdout);
    #endif
    while (std::cin >> name && name != "END"){
        printf("%s\n ", name.c_str());
        for (int i = 1; i <= 9; ++i){
            for (int j = 1; j <= 9; ++j){
                dir[i][j] = empty;
            }
        }
        vec.clear();
        path.clear();
        flag = false;
        std::cin >> startR >> startC >> direction >> exitR >> exitC;
        while (std::cin >> r && r){
            std::cin >> c;
            while (std::cin >> str && str != "*"){
                dir[r][c].push_back(str);
            }
        }
        r = startR;
        c = startC;
        if (direction == "E"){
            c++;
        } else if (direction == "W"){
            c--;
        } else if (direction == "S"){
            r++;
        } else if (direction == "N"){
            r--;
        }
        if (r == exitR && c == exitC){
            printf(" (%d,%d) (%d,%d)\n", startR, startC, r, c);
            continue;
        }
        vec.push_back(loc(startR, startC, -1, ' '));
        vec.push_back(loc(r, c, 0, direction[0]));
        pivot = 1;
        while (pivot < vec.size()){
            r = vec[pivot].r;
            c = vec[pivot].c;
            d = vec[pivot].direction;
            for (int i = 0; i < dir[r][c].size(); ++i){
                if (dir[r][c][i][0] == d){
                    for (int j = 1; j < dir[r][c][i].size(); ++j){
                        nextR = r;
                        nextC = c;
                        if (dir[r][c][i][j] == 'L'){
                            if (d == 'E'){
                                newd = 'N';
                            } else if (d == 'N'){
                                newd = 'W';
                            } else if (d == 'S'){
                                newd = 'E';
                            } else if (d == 'W'){
                                newd = 'S';
                            }
                        } else if (dir[r][c][i][j] == 'R'){
                            if (d == 'E'){
                                newd = 'S';
                            } else if (d == 'N'){
                                newd = 'E';
                            } else if (d == 'W'){
                                newd = 'N';
                            } else if (d == 'S'){
                                newd = 'W';
                            }
                        } else if (dir[r][c][i][j] == 'F'){
                            newd = d;
                        }
                        if (newd == 'E'){
                            nextC++;
                        } else if (newd == 'W'){
                            nextC--;
                        } else if (newd == 'S'){
                            nextR++;
                        } else if (newd == 'N'){
                            nextR--;
                        }
                        newloc = true;
                        for (int k = 0; k < vec.size(); ++k){
                            if (vec[k].r == nextR && vec[k].c == nextC && vec[k].direction == newd){
                                newloc = false;
                                break;
                            }
                        }
                        if (newloc && isValid(nextR, nextC)){
                            vec.push_back(loc(nextR, nextC, pivot, newd));
                            if (nextR == exitR && nextC == exitC){
                                printPath();
                                i = dir[r][c].size();
                                pivot = vec.size();
                                flag = true;
                                break;
                            }
                        }
                    }
                }
            }
            pivot++;
        }
        if (!flag){
            printf(" No Solution Possible\n");
        }
    }
    #ifdef debug
    fclose(stdin);
    fclose(stdout);
    #endif
    return 0;
}

相关推荐

  1. 816 - Abbott‘s Revenge (UVA)

    2023-12-12 14:06:02       44 阅读
  2. H12-811_190

    2023-12-12 14:06:02       16 阅读
  3. Acwing 818. 数组排序

    2023-12-12 14:06:02       11 阅读
  4. 【XR806开发板试用】xr806 RTC实验

    2023-12-12 14:06:02       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-12 14:06:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-12 14:06:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-12 14:06:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-12 14:06:02       20 阅读

热门阅读

  1. Docker入门概念

    2023-12-12 14:06:02       42 阅读
  2. 简单的小题集(八)

    2023-12-12 14:06:02       37 阅读
  3. openssl的x509命令工具

    2023-12-12 14:06:02       41 阅读
  4. C++入门【6-C++ 修饰符类型】

    2023-12-12 14:06:02       24 阅读