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;
}
相关推荐
艾莉丝努力练剑13 分钟前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
_殊途2 小时前
《Java HashMap底层原理全解析(源码+性能+面试)》
java·数据结构·算法
还债大湿兄2 小时前
《C++内存泄漏8大战场:Qt/MFC实战详解 + 面试高频陷阱破解》
c++·qt·mfc
珊瑚里的鱼5 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
AI+程序员在路上5 小时前
QTextCodec的功能及其在Qt5及Qt6中的演变
开发语言·c++·qt
Risehuxyc5 小时前
C++卸载了会影响电脑正常使用吗?解析C++运行库的作用与卸载后果
开发语言·c++
秋说6 小时前
【PTA数据结构 | C语言版】顺序队列的3个操作
c语言·数据结构·算法
lifallen7 小时前
Kafka 时间轮深度解析:如何O(1)处理定时任务
java·数据结构·分布式·后端·算法·kafka
liupenglove7 小时前
自动驾驶数据仓库:时间片合并算法。
大数据·数据仓库·算法·elasticsearch·自动驾驶
python_tty8 小时前
排序算法(二):插入排序
算法·排序算法