[CareerCup] 8.6 Jigsaw Puzzle 拼图游戏

简介:

8.6 Implement a jigsaw puzzle. Design the data structures and explain an algorithm to solve the puzzle. You can assume that you have a f itsWith method which, when passed two puzzle pieces, returns true if the two pieces belong together.

这道题让我们设计一个拼图游戏,根据书上的解释,如上图所示是一种最基本的拼图游戏,每一片有四条边,总共有三种边,inner, outer, 和 flat的,角落的一片有两个flat的边,中间的片没有flat的边。那么我们需要一个边类Edge,还需要一个片类Piece,和一个拼图类Puzzle,在拼图类里用sort来初始化参数,再用solve来完成拼图。这里不得不吐槽一下,这道题在网上下载的代码里面都木有,而且书上的代码有很多小错误,改正后参见代码如下:

class Edge;

class Piece {
public:
    vector<Edge*> _edges;
    bool isCorner() {} // ...
};

enum Type { inner, outer, flat };

class Edge {
public:
    Piece *_parent;
    Type _type;
    int _index;
    Edge *_attachedTo;
    bool fitsWith(Edge *edge) {} // ...
};

class Puzzle {
public:
    vector<Piece*> _pieces;
    vector<vector<Piece*> > _solution;
    vector<Edge*> _inners, _outers, _flats;
    vector<Piece*> _corners;
    void sort() {
        for (Piece *p : _pieces ) {
            if (p->isCorner()) _corners.push_back(p);
            for (Edge *e : p->_edges) {
                if (e->_type == Type::inner) _inners.push_back(e);
                if (e->_type == Type::outer) _outers.push_back(e);
            }
        }
    }
    void solve() {
        Edge *currentEdge = getExposedEdge(_corners[0]);
        while (currentEdge != nullptr) {
            vector<Edge*> opposites = currentEdge->_type == Type::inner ? _outers : _inners;
            for (Edge *e : opposites) {
                if (currentEdge->fitsWith(e)) {
                    attachEdges(currentEdge, e);
                    removeFromList(currentEdge);
                    removeFromList(e);
                    currentEdge = nextExposedEdge(e);
                    break;
                }
            }
        }
    }
    void removeFromList(Edge *edge) {
        if (edge->_type == Type::flat) return;
        vector<Edge*> array = edge->_type == Type::inner ? _inners : _outers;
        for (vector<Edge*>::iterator it = array.begin(); it != array.end(); ++it) {
            if (*it == edge) {
                array.erase(it);
                break;
            }
        }        
    }
    Edge* nextExposedEdge(Edge *edge) {
        int next_idx = (edge->_index + 2) % 4; // Opposite edge
        Edge *next_edge = edge->_parent->_edges[next_idx];
        if (isExposed(next_edge)) {
            return next_edge;
        }
        return getExposedEdge(edge->_parent);
    }
    void attachEdges(Edge *e1, Edge *e2) {
        e1->_attachedTo = e2;
        e2->_attachedTo = e1;
    }
    bool isExposed(Edge *edge) {
        return edge->_type != Type::flat && edge->_attachedTo == nullptr;
    }
    Edge* getExposedEdge(Piece *p) {
        for (Edge *e : p->_edges) {
            if (isExposed(e)) return e;
        }
        return nullptr;
    }
};

本文转自博客园Grandyang的博客,原文链接:拼图游戏[CareerCup] 8.6 Jigsaw Puzzle ,如需转载请自行联系原博主。

相关文章
|
2天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1079 0
|
11天前
|
人工智能 运维 安全
|
10天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
2天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
267 0
|
9天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
762 23
|
2天前
|
缓存 供应链 监控
VVIC seller_search 排行榜搜索接口深度分析及 Python 实现
VVIC搜款网seller_search接口提供服装批发市场的商品及商家排行榜数据,涵盖热销榜、销量排名、类目趋势等,支持多维度筛选与数据分析,助力选品决策、竞品分析与市场预测,为服装供应链提供有力数据支撑。
|
2天前
|
缓存 监控 API
Amazon item_review 商品评论接口深度分析及 Python 实现
亚马逊商品评论接口(item_review)可获取用户评分、评论内容及时间等数据,支持多维度筛选与分页调用,结合Python实现情感分析、关键词提取与可视化,助力竞品分析、产品优化与市场决策。