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;
}
相关推荐
Shaoshing22 分钟前
LeetCode100 42.接雨水
java·算法·leetcode
域限奇点访客36 分钟前
用AI生成问卷的网站怎么选?看题目录入结构、题型映射和生成后的校验
算法
qq_466302452 小时前
如何通过部分文件名,读取出整个文件名
c++·qt
not coder2 小时前
一文讲通--从树到红黑树
数据结构·算法
octopus_c2 小时前
C++ 入门
开发语言·c++·算法
ZhengEnCi2 小时前
2026年10月30日AI早报:Gemini 4 Carbon登顶、DeepSeek融资1055亿、智元机器人上岗实测
人工智能·算法
强哥聊算力2 小时前
《算力江湖·Intel帝国往事》第三集:安迪·格鲁夫的铁血时代:Intel为什么能把对手逼到墙角?
运维·人工智能·科技·算法·ai·gpu算力
Shaoshing2 小时前
LeetCode100 11. 盛最多水的容器
算法·leetcode
raindayinrain3 小时前
c++新特性--实用新特性
c++
Soneswy3 小时前
C++基础篇——类与对象(中)
开发语言·c++