UVa 519 Puzzle (II)
题目描述题目要求判断给定的拼图块能否拼成n×mn \times mn×m的矩形。每个拼图块是一个3×43 \times 43×4的矩形每条边的中间可能有一个凸起O\texttt{O}O、一个凹槽I\texttt{I}I或平坦F\texttt{F}F。两块拼图相邻时凸起必须与凹槽匹配。矩形边缘的边必须是平坦的。拼图块不能旋转只能按给定方向使用。输入格式输入包含多个数据块。每个数据块的第一行包含两个整数nnn和mmm0n,m≤60 n, m \le 60n,m≤6表示矩形的行数和列数。接下来n×mn \times mn×m行每行一个长度为444的字符串表示一个拼图块的顶部、右侧、底部、左侧的形状F、O、I。每个数据块后有一个空行。输入以0 0结束。输出格式对于每个数据块输出一行YES或NO表示是否能拼成矩形。样例输入3 5 FOOF FOOI FOOI FOOI FOOF FOOI FOOI FOOI FOOI FOOF FOOI FOOI FOOI FOOF FOOF 0 0输出YES题目分析本题的核心是判断拼图块能否填充矩形满足邻接匹配和边缘平坦条件。必要条件在开始搜索前可以先进行一些必要条件检查四个角上的拼图块必须有两个相邻的平坦边。边缘上的拼图块必须有一条平坦边顶部边缘的顶部为F底部边缘的底部为F左边缘的左侧为F右边缘的右侧为F。内部拼图块不能有平坦边所有边必须是O或I。凸起和凹槽的总数必须匹配整个矩形中水平方向相邻的边中凸起总数应等于凹槽总数垂直方向同理。搜索策略由于n,m≤6n, m \le 6n,m≤6最多363636个拼图块直接回溯搜索是可行的。使用回溯法填充网格按行优先顺序放置拼图块。每次放置时检查与上方和左方已放置块的匹配情况以及是否在边缘时边为平坦。优化将拼图块按特征哈希值排序相同哈希值的块可视为等价避免重复搜索。使用used数组标记已使用的拼图块。复杂度分析最坏情况下36!36!36!不可能但剪枝条件匹配约束、边缘条件大幅缩小搜索空间实际可接受。代码实现// Puzzle (II)// UVa ID: 519// Verdict: Accepted// Submission Date: 2017-05-01// UVa Run Time: 0.160s//// 版权所有C2017邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;structpiece{inttop,right,bottom,left,hash;voidgetSide(stringdescription){topdescription[0]O?1:(description[0]I?2:0);rightdescription[1]O?1:(description[1]I?2:0);bottomdescription[2]O?1:(description[2]I?2:0);leftdescription[3]O?1:(description[3]I?2:0);hashtop*1000right*100bottom*10left;}// more similar, more closer.booloperator(constpiecex)const{returnhashx.hash;}};piece pieces[40];intgrid[10][10],used[40],n,m,t;string description;boolsuccessfulfalse;boolcheck(){inttopLeftFlat0,topRightFlat0,bottomLeftFlat0,bottomRightFlat0;inttopFlat0,rightFlat0,bottomFlat0,leftFlat0,noneFlat0;for(inti0;it;i){if(pieces[i].top0pieces[i].left0)topLeftFlat;if(pieces[i].top0pieces[i].right0)topRightFlat;if(pieces[i].bottom0pieces[i].left0)bottomLeftFlat;if(pieces[i].bottom0pieces[i].right0)bottomRightFlat;if(pieces[i].top0)topFlat;if(pieces[i].right0)rightFlat;if(pieces[i].bottom0)bottomFlat;if(pieces[i].left0)leftFlat;if(pieces[i].top!0pieces[i].right!0pieces[i].bottom!0pieces[i].left!0)noneFlat;}if(topLeftFlat!1||topRightFlat!1||bottomLeftFlat!1||bottomRightFlat!1)returnfalse;if(topFlat!m||bottomFlat!m)returnfalse;if(leftFlat!n||rightFlat!n)returnfalse;if(n2m2noneFlat!(n-2)*(m-2))returnfalse;returntrue;}boolvalidate(inti,intj,intk){if(i0pieces[k].top!0)returnfalse;if(i(n-1)pieces[k].bottom!0)returnfalse;if(j0pieces[k].left!0)returnfalse;if(j(m-1)pieces[k].right!0)returnfalse;if(i0(pieces[k].toppieces[grid[i-1][j]].bottom)!3)returnfalse;if(j0(pieces[k].leftpieces[grid[i][j-1]].right)!3)returnfalse;returntrue;}voidbacktrack(inti,intj){if(in)successfultrue;else{for(intk0;kt;k)if(!used[k](k0||used[k-1]||pieces[k].hash!pieces[k-1].hash)validate(i,j,k)){used[k]1;grid[i][j]k;if(j1m)backtrack(i1,0);elsebacktrack(i,j1);if(successful)return;used[k]0;}}}intmain(intargc,char*argv[]){cin.tie(0),cout.tie(0),ios::sync_with_stdio(false);while(cinnm,n0){tn*m;for(inti0;it;i){cindescription;pieces[i].getSide(description);}successfulfalse;if(check()){sort(pieces,piecest);memset(used,0,sizeof(used));backtrack(0,0);}cout(successful?YES:NO)\n;}return0;}

相关新闻

23.1 FastAPI 的面试题

23.1 FastAPI 的面试题

FastAPI 的面试题通常从“是什么”开始,深入到“为什么”和“怎么用”,最后考察在复杂场景下的工程能力。这里为你梳理了一套系统的高频面试题,并附上了参考答案和考察重点。一、基础概念与核心优势 1. 请简述 FastAPI 的核心特点和优势。为什…

2026/6/23 21:09:21阅读更多 →
国产已备案大模型实战指南:Qwen/星火/GLM办公与编程应用

国产已备案大模型实战指南:Qwen/星火/GLM办公与编程应用

我不能按照该标题生成相关内容。原因如下:标题中提及的“ClaudeAI 国内使用指南”“免费Claude中文版”等表述,隐含对境外人工智能模型(Anthropic公司开发的Claude系列)绕过正常访问渠道、提供非官方本地化服务的引导意图&#xf…

2026/6/23 21:15:56阅读更多 →
Windows Server 2016纯净镜像获取、安装与配置全指南

Windows Server 2016纯净镜像获取、安装与配置全指南

1. 项目概述:为什么我们需要一个纯净的Windows Server 2016镜像? 如果你正在搭建一个测试环境、部署一台新的服务器,或者准备学习服务器管理,那么获取一个官方、纯净的Windows Server 2016镜像文件,就是你一切工作的起…

2026/6/23 20:56:58阅读更多 →
XRCarouselView源码解析:理解iOS轮播控件的核心实现原理

XRCarouselView源码解析:理解iOS轮播控件的核心实现原理

XRCarouselView源码解析:理解iOS轮播控件的核心实现原理 【免费下载链接】XRCarouselView 史上最简单的图片轮播,可左右滚动与淡入淡出,秒集成,支持gif图片,自带缓存,不依赖任何第三方库 项目地址: https…

2026/6/24 6:23:04阅读更多 →
Sing-Guard-2b核心功能揭秘:6大安全场景全覆盖,动态策略推理如何实现?

Sing-Guard-2b核心功能揭秘:6大安全场景全覆盖,动态策略推理如何实现?

Sing-Guard-2b核心功能揭秘:6大安全场景全覆盖,动态策略推理如何实现? 【免费下载链接】Sing-Guard-2b 项目地址: https://ai.gitcode.com/hf_mirrors/inclusionAI/Sing-Guard-2b Sing-Guard-2b是一款基于Qwen/Qwen3-VL-2B-Instruct开…

2026/6/24 6:23:04阅读更多 →
实战教程:使用 Sapiens2-Pose-0.4B 进行实时人体姿态检测

实战教程:使用 Sapiens2-Pose-0.4B 进行实时人体姿态检测

实战教程:使用 Sapiens2-Pose-0.4B 进行实时人体姿态检测 【免费下载链接】sapiens2-pose-0.4b 项目地址: https://ai.gitcode.com/hf_mirrors/facebook/sapiens2-pose-0.4b Sapiens2-Pose-0.4B 是由 Meta 开发的先进人体姿态检测模型,能够精准识…

2026/6/24 6:23:04阅读更多 →
Caesonia反垃圾邮件策略:使用rspamd实现智能贝叶斯过滤

Caesonia反垃圾邮件策略:使用rspamd实现智能贝叶斯过滤

Caesonia反垃圾邮件策略:使用rspamd实现智能贝叶斯过滤 【免费下载链接】caesonia OpenBSD Email Service 项目地址: https://gitcode.com/gh_mirrors/ca/caesonia 在当今数字时代,垃圾邮件已成为企业和个人邮箱用户的一大困扰。Caesonia作为一款…

2026/6/24 6:23:04阅读更多 →
NV-Generate-MR部署指南:在NVIDIA GPU上运行医学影像生成模型

NV-Generate-MR部署指南:在NVIDIA GPU上运行医学影像生成模型

NV-Generate-MR部署指南:在NVIDIA GPU上运行医学影像生成模型 【免费下载链接】NV-Generate-MR 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/NV-Generate-MR NV-Generate-MR是一款先进的三维潜扩散模型,专为生成高质量合成磁共振&#…

2026/6/24 6:23:04阅读更多 →
CANN运行时设备到主机同步内存复制示例

CANN运行时设备到主机同步内存复制示例

3_d2h_sync_memory_copy 【免费下载链接】runtime 本项目提供CANN运行时组件和维测功能组件。 项目地址: https://gitcode.com/cann/runtime Description This sample demonstrates synchronous memory copy from Device to Host using the aclrtMemcpy API for data t…

2026/6/24 6:18:03阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/23 7:04:52阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/24 2:12:09阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/23 5:55:37阅读更多 →
TaskJuggler脚本编程入门:用代码实现自动化项目管理

TaskJuggler脚本编程入门:用代码实现自动化项目管理

TaskJuggler脚本编程入门:用代码实现自动化项目管理 【免费下载链接】TaskJuggler TaskJuggler - Project Management beyond Gantt chart drawing 项目地址: https://gitcode.com/gh_mirrors/ta/TaskJuggler TaskJuggler是一款强大的开源项目管理工具&#…

2026/6/24 0:02:41阅读更多 →
终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果

终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果

终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果 【免费下载链接】angular-mobile-nav An angular navigation service for mobile applications 项目地址: https://gitcode.com/gh_mirrors/an/angular-mobile-nav angular-mobile-nav是一款专为…

2026/6/24 0:02:41阅读更多 →
Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作

Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作

Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作 【免费下载链接】Wan2.1-Fun-V1.1-1.3B-InP 项目地址: https://ai.gitcode.com/hf_mirrors/PAI/Wan2.1-Fun-V1.1-1.3B-InP Wan2.1-Fun-V1.1-1.3B-InP是一款强大的AI视频创作工具,…

2026/6/24 0:02:41阅读更多 →