816 - Abbott‘s Revenge (UVA)

题目链接如下:

Online Judge

刘汝佳大佬的代码如下:

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

有点抽象,但很简洁。

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

cpp 复制代码
#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;
}
相关推荐
木木子2213 分钟前
# 猜数字游戏 — HarmonyOS交互逻辑与随机算法实现
算法·游戏·华为·交互·harmonyos
stolentime36 分钟前
SP8549 MAIN75 - BST again题解
c++·算法·二叉树·深度优先·图论·记忆化搜索·组合数学
ziguo11221 小时前
C/C++ 错误处理全解:从 errno 到 C++ 异常
linux·c语言·c++·windows·visual studio
stolentime1 小时前
AT_pakencamp_2020_day1_k Gcd of Sum题解
c++·算法
2601_956121971 小时前
map_计蒜客T1271 完美K倍子数组
c++·算法
编程圈子2 小时前
电机驱动开发学习19. 霍尔 BLDC 三段式 FOC 启动算法
驱动开发·学习·算法
Hello_Damon_Nikola2 小时前
伺服电机堵转检测算法详解
单片机·嵌入式硬件·算法
罗小罗同学2 小时前
安德森癌症中心发表SCOPE IO模型,实现了对罕见肿瘤帕博利珠单抗疗效的精准预测,在患者早期即可预判药效
人工智能·算法·医学图像处理·医学ai
王维同学2 小时前
IFEO Debugger、VerifierDlls 与 SilentProcessExit 配置
c++·windows·安全·注册表
变量未定义~3 小时前
Tarjan算法-强连通分量、路径、出差
算法