[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 ,如需转载请自行联系原博主。

相关文章
|
人工智能 IDE 程序员
Qoder用户上手指南:安装、登录、快捷键、功能亮点(新用户免费领300credits,首购2美元/月)
这个容易让程序员上瘾的 Agentic Coding 平台有哪些上头的功能?对于小白开发者和资深开发者如何用好Qoder呢?
17958 6
Qoder用户上手指南:安装、登录、快捷键、功能亮点(新用户免费领300credits,首购2美元/月)
|
存储 Kubernetes 搜索推荐
使用容器方式创建firecracker虚拟机
使用容器方式创建firecracker虚拟机
902 1
|
5天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23324 5
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
14天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。
5121 25
|
10天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
3654 12
|
9天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
3001 10
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
26天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
20906 63
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)