AtCoder - ABC 326 - D - ABC Puzzle (DFS)

看了很多题解都是写了一大坨,看起来非常的混乱,然而自己去写的时候又不可避免的写了一坨,只能尽可能的去优化代码可读性。


Time Limit: 4 sec / Memory Limit: 1024 MB

问题陈述

给你一个整数 N N N 和长度为 N N N 的字符串 R R R C C C ,它们由 A 、 B A、B AB C C C 组成。请解决下面的问题。

有一个 N × N N×N N×N 网格。所有单元格最初都是空的。您最多可以在每个单元格中写入 A 、 B A、B AB C C C 中的一个字符。(也可以让单元格为空)。

确定是否有可能满足以下所有条件,如果有可能,请打印一种满足这些条件的方法。

每一行和每一列正好包含一个 A、一个 B和一个 C。写入 i − t h i-th ith 行中最左边的字符与 R R R 中的 i − t h i-th ith 字符相匹配。写在 i − t h i -th ith 列中最顶端的字符与 C C C i − t h i -th ith 字符匹配。

限制因素

N N N 是介于 3 3 3 5 5 5 之间的整数,包括首尾两个整数。 R R R C C C 是长度为 N N N 的字符串,由 ABC组成。

输入

输入内容由标准输入法提供,格式如下

N
R
C

输出

如果无法填充网格以满足问题陈述中的条件,则单行打印 “No”。
否则,按以下格式打印一种填充网格的方法:

Yes
​A1
A2​ 
⋮
AN

第一行应包含 “是”。随后 N N N 行中的 i − t h i-th ith 应包含长度为 N N N 的字符串 A i A_i Ai​ 。

  • 如果 A i A_i Ai​ 的第 j j j 字符是 “.”,则表示从上往下 i − t h i-th ith 行和从左往右 j − t h j-th jth 列中的单元格为空。
  • 如果 A i A_i Ai 的第 j j j 个字符是 “A”,那么它表示 "A " 写在从上往下第 i i i 行、从左往上第 j j j 列的单元格中。
  • 如果 A i A_i Ai​ 的第 j j j 个字符是 “B”,那么它表示 "B "被写在从上往下第 i i i 行、从左往上第 j j j 列的单元格中。
  • 如果 A i A_i Ai​ 的第 j j j 个字符是 “C”,那么它表示 "C "被写在从上往下第 i i i 行、从左往上第 j j j 列的单元格中。

如果有多种正确的填充网格的方法,您可以打印其中任何一种。

Sample Input 1

5
ABCBC
ACAAB

Sample Output 1

Yes
AC..B
.BA.C
C.BA.
BA.C.
..CBA

对于这题4s的时间限制,并且联想到之前做过的八皇后问题,就想到可以用DFS来解决。

题目要求每行每列都只能有各一个 A , B , C A,B,C A,B,C 且都必须有这三个字母,我们可以以答案数组的层数同时作为dfs的层数,然后在搜到每一层的时候把这一层应有的 A , B , C A,B,C A,B,C 三个字母全部填上,这样我们就保证了每一行有且仅有一对 A , B , C A,B,C A,B,C 所以我们仅仅需要再判断一下每一列是否满足要求即可。
在这里就可以转化为八皇后模型了,开三个判断列的数组,每个对应一个字母,如果可以填就填上。

对于如何在一层里填上三个字母,我们需要一次性填上三个。
假如你写出了三层循环来找字母,那么你填出来之后就变成了一行只有一个字母了。
所以写出一个三层循环,每一层循环的是每个字母要填的位置,这里把重叠的位置全部continue掉。

代码:

#include<iostream>
#include<cstring>
#pragma warning(disable: 4996)
using namespace std;
const int N = 10;int n;char g[N][N];	//答案数组
char a[N];
char b[N];//判断某一列是否已经有A或B或C
bool a_line[N];
bool b_line[N];
bool c_line[N];//u代表的是层数,即答案数组的x轴
void dfs(int u) {if (u == n + 1) {	//如果搜满了所有层,就进行判断for (int i = 1; i <= n; i++) {		//第一次判断for (int j = 1; j <= n; j++) {	//判断最左边的字母是不是符合字符串A的顺序if (g[i][j] != '.') {if (g[i][j] == a[i])break;else return;}if (j == n && g[i][j] == '.')return;	//要是搜完了所有的甚至都没一个字母,直接跳}}for (int i = 1; i <= n; i++) {		//第二次判断for (int j = 1; j <= n; j++) {	//判断最上边的字母是不是符合字符串B的顺序if (g[j][i] != '.') {		//以下同理if (g[j][i] != b[i])return;else break;}if (j == n && g[j][i] == '.')return;}}
//-------------------------------------------------------------------------------------//输出答案cout << "Yes" << endl;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {cout << g[i][j];}puts("");}exit(0);	//直接从这里终结整个程序}
//--------------------------------------------------------------------------------------//搜索部分//这里枚举的i,j,k是字母A,B,C填入的位置for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (i == j)continue;	//A和B不能填到一个位置,直接continuefor (int k = 1; k <= n; k++) {if (i == k || j == k)continue;	//A和C,B和C不能填到一个位置if (!a_line[i] && !b_line[j] && !c_line[k]){//如果这一列还没有被填入过相应的字母g[u][i] = 'A', g[u][j] = 'B', g[u][k] = 'C';a_line[i] = b_line[j] = c_line[k] = 1;dfs(u + 1);//搜下一层//回溯状态g[u][i] = g[u][j] = g[u][k] = '.';a_line[i] = b_line[j] = c_line[k] = 0;}}}}
}
//----------------------------------------------------------------------------------------------
int main() {cin >> n;scanf("%s%s", a + 1, b + 1);for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {g[i][j] = '.';}}dfs(1);//如果没找到答案就直接输出Nocout << "No";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/776179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

763. 划分字母区间(力扣LeetCode)

763. 划分字母区间 题目描述 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串…

Web开发基本流程

Web是全球广域网&#xff0c;能够通过浏览器访问的网站。我们要访问网站&#xff0c;首先要在浏览器输入对应的域名。 浏览器也是一个程序&#xff0c;京东的网站也是一个程序&#xff0c;在京东那边电脑运行着&#xff0c;我们只是通过浏览器远程访问。京东的程序由三个部分组…

【题目】【网络系统管理】2022 年全国职业院校技能大赛 网络系统管理赛项 模块 A:网络构建

2022 年全国职业院校技能大赛 网络系统管理赛项 模块 A&#xff1a;网络构建 目录 考试说明 … 3 任务描述 … 3 任务清单 … 3 &#xff08;一&#xff09;基础配置 … 3 &#xff08;二&#xff09;有线网络配置 … 4 &#xff08;三&#xff09;无线网络配置 … 5 &…

深入解析MD5哈希算法:原理、应用与安全性

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 本文将深入探讨MD5哈希算法的工作原理、应用场景以及安全性问题。我们将了解MD5如何生成固定长度的哈希值&#xff0c;以及它在数…

PHiSeg:捕捉医学图像分割中的不确定性

PHiSeg&#xff1a;捕捉医学图像分割中的不确定性 摘要引言方法 PHiSeg Capturing Uncertainty in Medical Image Segmentation 摘要 解剖结构和病理的分割本质上是模糊的。例如&#xff0c;结构边界可能不清晰可见&#xff0c;或者不同的专家可能具有不同的注释风格。大多数当…

C++ 之多态虚函数原理及应用

文章目录 多态基本概念和原理虚函数的基本原理和概念虚析构和纯虚析构多重继承中的虚函数小结 多态基本概念和原理 多态的基本概念 **多态是C面向对象三大特性之一** 多态的定义 多态是一种面向对象编程概念&#xff0c;指同一个行为&#xff08;方法&#xff09;在不同的对象上…

Java上机实验报告(4)

实验 &#xff08;4&#xff09; 项目名称&#xff1a;子类与继承-求圆柱和圆锥 一、 实验报告内容一般包括以下几个内容&#xff1a; 实验项目名称 实验4 子类与继承-求圆柱和圆锥实验目的和要求 本实验的目的&#xff1a; &#xff08;1&#xff09;掌握&#xff08;继承&a…

JavaScript 定时器详解

定时器 ​ JavaScript 在浏览器中是单线程执行的&#xff0c;但允许使用定时器指定在某个时间之后或每隔一段时间就执行相应的代码。setTimeout() 用于指定在一定时间后执行某些代码&#xff0c;而 setInterval() 用于指定每隔一段时间执行某些代码。 setTimeout() 方法 ​ …

【前端学习——js篇】5.事件循环

详细&#xff1a;https://github.com/febobo/web-interview 5.事件循环 js是一种单线程语言&#xff0c;同一时间内只能做一件事情&#xff0c;为了避免单线程阻塞的方法就是事件循环。 在javascript当中&#xff0c;所有的任务都可以分为&#xff1a; 同步任务&#xff1a;按…

Windows10 Version22h2 补丁kb5034441更新失败

By wdhuag 20240328 参考: Windows10安装KB5034441更新报错0x80070643_2024-01 适用于 windows 10 version 22h2 安全更新,适合基于 x64 -CSDN博客 windows10&#xff08;KB5034441&#xff09;更新失败报错 0x80070643解决方法_kb5034441更新失败-CSDN博客 如何修复 Windo…

07|Java IO流与网络编程入门教程:通俗易懂,实例丰富

一、IO流概念与应用 什么是IO流? 想象一下水管流水,水从一端流入流出的过程就像是数据在程序中的传输。在Java世界里,IO流就是这样一个抽象概念,它是数据在不同存储介质或网络之间传输的一种方式。简单来说,如果你把数据看作水流,那么IO流就是承载这个水流的管道,它可以…

01.ArcEngine中IField的属性详细描述

目录 0.代码样例 1. AliasName 2.CheckValue 3.DefaultValue 4.Domain 5.DomainFixed 6.Editable 7.GeometryDef 8.IsNullable 9.Length 10.Name 11.Precision 12.Required 13.Scale 14.Type 15.VarType 0.代码样例 IFields fields featureclass…

双通道内存@DDR5多通道内存

文章目录 多通道内存DDR4及以前的内存的双通道DDR5往后的双通道和多通道半位宽4通道组合 其他组合测试 DDR5介绍概览重要Features特点 总结 多通道内存 DDR4及以前的内存的双通道 双通道内存是一种内存架构设计&#xff0c;通过在主板上配置两个或多个独立且同时工作的内存控制…

管理阿里云服务器ECS -- 网站选型和搭建

小云&#xff1a;我已经学会了如何登录云服务器ECS了&#xff0c;但是要如何搭建网站呢&#xff1f; 老王&#xff1a;目前有很多的个人网站系统软件&#xff0c;其中 WordPress 是使用非常广泛的一款&#xff0c;而且也可以把 WordPress 当作一个内容管理系统&#xff08;CMS…

使用yolov9来实现人体姿态识别估计(定位图像或视频中人体的关键部位)教程+代码

yolov9人体姿态识别&#xff1a; 相较于之前的YOLO版本&#xff0c;YOLOv9可能会进一步提升处理速度和精度&#xff0c;特别是在姿态估计场景中&#xff0c;通过改进网络结构、利用更高效的特征提取器以及优化损失函数等手段来提升对复杂人体姿态变化的捕捉能力。由于YOLOv9的…

架构师之路--docker命令实践整理

安装docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine sudo yum install -y yum-utils sudo yum-config-manager --add-repo http://mirrors.aliyun.com/…

开源博客项目Blog .NET Core源码学习(12:App.Application项目结构分析)

开源博客项目Blog的App.Application项目主要定义网站页面使用的数据类&#xff0c;同时定义各类数据的增删改查操作接口和实现类。App.Application项目未安装Nuget包&#xff0c;主要引用App.Core项目的类型。   App.Application项目的顶层文件夹如下图所示&#xff0c;下面逐…

巨控GRM110系列:短距离内的无线通讯模块

标签: #巨控GRM110 #无线通讯 #ROLA技术 #工业自动化 #远程数据采集 在工业自动化和智能制造的领域中&#xff0c;数据的准确传输是实现高效生产的关键。随着技术的不断进步&#xff0c;无线通讯技术已成为破解远距离数据传输难题的利器。今天&#xff0c;我们将聚焦于一款革命…

U盘未格式化?数据恢复大揭秘!

在日常办公和生活中&#xff0c;U盘已成为我们不可或缺的数据存储工具。然而&#xff0c;有时我们会遇到这样一个令人头疼的问题&#xff1a;原本正常使用的U盘&#xff0c;突然提示“未格式化”&#xff0c;里面的文件似乎都消失不见了。面对这种情况&#xff0c;很多人会感到…

35岁,程序员职业生涯的新起点

近年来&#xff0c;关于程序员职业生涯的讨论日益热烈&#xff0c;而“35岁被认为是程序员职业生涯的分水岭”更是成为了一个备受关注的话题。在这篇文章中&#xff0c;我们将探讨这一说法的合理性&#xff0c;并从事实和数据的角度来分析&#xff0c;为什么35岁并非程序员职业…