[PAT 甲级] 1179 Chemical Equation (DFS)

embedded/2025/1/16 10:43:17/


英文题目

题目翻译(GPT):

1179 化学方程式

化学方程式是一种用符号和公式表示化学反应的方法,其中反应物在方程式的左侧,生成物在右侧。例如:
CH₄ + 2O₂ -> CO₂ + 2H₂O
表示反应物为甲烷和氧气(CH₄O₂),生成物为二氧化碳和水(CO₂H₂O)。

现在给定一组反应物和生成物,你需要判断通过何种方式可以得到这些生成物,要求每种反应物只能使用一次。为简化起见,我们假设方程式右侧的所有物质都作为单一生成物。

输入说明

输入文件包含一个测试用例。对于每个测试用例:

  • 第一行给出一个整数 N2 ≤ N ≤ 20),表示 N 个反应物的索引,它们是 2 位数字的不同索引。
  • 第二行给出一个整数 M1 ≤ M ≤ 10),表示 M 个生成物的索引,它们也是 2 位数字的不同索引。
  • 接下来是一正整数 KK ≤ 50),表示接下来的 K 行反应方程。

每行以如下格式表示反应方程:

reactant_1 + reactant_2 + ... + reactant_n -> product

其中,所有反应物是不同的,并且按照索引递增排序。

注意
  • 确保同一组反应物不会生成两个或更多不同的生成物。例如:
    01 + 02 -> 0301 + 02 -> 04 是不可能的。
  • 如果某个反应物未参与反应,则不能仅以它自身生成生成物。例如:
    01 -> 01 是不允许的,无论该方程是否在输入中。
  • 每种生成物在反应方程列表中不会有超过 5 种不同的生成方式。

输出说明

对于每个测试用例,输出使用给定反应物得到所有指定生成物的方程式。注意,每种反应物只能被使用一次。

  • 每个方程占一行,格式与输入中的方程一致,且生成物的顺序与输入中的顺序相同。
  • 对于每个生成物,如果存在多个解决方案,输出字典序最小的方案(按照反应物序列递增的顺序比较)。
    • 例如,反应物序列 {a₁, …, aₘ} 被认为比序列 {b₁, …, bₙ} 小,当且仅当存在一个最小下标 j,使得 aⱼ < bⱼ,且前 j-1 项相等。

保证至少存在一个解决方案。

思路:

看到N和M的范围就注定了这题是暴搜加回溯,至于字典序,直接对于方程式的字符串排序就行,要能熟练运用 map 以及 string 的话,这题就很简单了。

代码

#include<bits/stdc++.h>using namespace std;const int N = 110;#define int long longint n, m, k;bool ans = 0;string a[N];
map<string, int> reac, pro;
map<string, vector<string>> equ;
map<string, string> ways;void dfs(int u) 
{if(u == m + 1) {for (int i = 1; i <= m; i++) {string p = a[i];string e = ways[p];cout << e.substr(0, 2);for (int j = 2; j < e.size(); j+=2) {cout << " + " << e.substr(j,2);}cout << " -> " << p << endl;}ans = 1;return ;}string p = a[u];for (string e : equ[p]) {int f = 1;for (int i = 0; i < e.size(); i+=2) {string r = e.substr(i, 2);if(reac[r] == 0) {f = 0;break;}}if(!f) continue;for (int i = 0; i < e.size(); i+=2) {string r = e.substr(i, 2);reac[r] = 0;}ways[p] = e;dfs(u + 1);if(ans) return;for (int i = 0; i < e.size(); i+=2) {string r = e.substr(i, 2);reac[r] = 1;}ways[p] = "";}
}void solve()
{cin >> n;for (int i = 1; i <= n; i++) {string s;cin >> s;reac[s] = 1;}cin >> m;for (int i = 1; i <= m; i++) {cin >> a[i];string p = a[i];if (reac[p] == 1 && equ[p].size() == 0) {equ[p].push_back(p);}}cin >> k;getchar();while(k --) {string s;getline(cin, s);string p = s.substr(s.size() - 2), h;for (int i = 0; i < s.size() - 6; i += 5) {h += s.substr(i, 2);}equ[p].push_back(h);}for (auto& it : equ) {sort(it.second.begin(), it.second.end());}dfs(1);return ;
}signed main()
{int T = 1;while(T--) solve();return 0;
}


http://www.ppmy.cn/embedded/154374.html

相关文章

Oracle 23ai新特性:表值构造函数

随着 Oracle 数据库不断发展&#xff0c;新版本引入了许多增强功能和特性&#xff0c;以提高开发效率、简化 SQL 编写并优化性能。Oracle 23c 引入了表值构造器&#xff08;Table Values Constructor&#xff09;&#xff0c;这一特性允许用户直接在 SQL 语句中定义和使用内联表…

如何使用策略模式并让spring管理

1、策略模式公共接口类 BankFileStrategy public interface BankFileStrategy {String getBankFile(String bankType) throws Exception; } 2、策略模式业务实现类 Slf4j Component public class ConcreteStrategy implements BankFileStrategy {Overridepublic String ge…

zookeeper 基本原理-单机模式、集群模式

单机模式 单机安装非常简单&#xff0c;只要获取到 Zookeeper 的压缩包并解压到某个目录如&#xff1a;C:\zookeeper-3.4.5\下&#xff0c;Zookeeper 的启动脚本在 bin 目录下&#xff0c;Windows 下的启动脚本是 zkServer.cmd。 在你执行启动脚本之前&#xff0c;还有几个基本…

自动生成数据:SQLark 让数据测试更高效

在新版本的业务系统开发过程中&#xff0c;需要生成大量的测试数据来模拟真实的业务场景&#xff0c;测试系统的稳定性和性能。今天分享一下我使用SQLark生成测试数据的经验&#xff0c;它能够提供8大类47个子类的数据规则&#xff0c;快速构建仿真测试数据环境&#xff0c;还支…

SQL 快速参考

SQL 快速参考 介绍 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于管理关系数据库管理系统的标准编程语言。它用于执行各种操作&#xff0c;如查询、更新、插入和删除数据库中的数据。本快速参考指南提供了SQL的基本语法和常用命…

基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解

1. 背景与目标 ENSO&#xff08;El Nio-Southern Oscillation&#xff09;是全球气候系统中最显著的年际变率现象之一&#xff0c;对全球气候、农业、渔业等有着深远的影响。准确预测ENSO事件的发生和发展对于减灾防灾具有重要意义。近年来&#xff0c;深度学习技术在气象领域…

react中hooks之useEffect 用法总结

1. 什么是函数的副作用&#xff08;Side Effects&#xff09; 副作用是指在组件渲染过程中&#xff0c;除了返回 JSX 之外的其他操作&#xff0c;例如&#xff1a; 数据获取&#xff08;API 调用&#xff09;订阅数据源手动修改 DOM设置定时器存储数据日志记录 纯函数是特定的…

深入理解循环神经网络(RNN):原理、应用与挑战

引言 在深度学习的众多模型中&#xff0c;循环神经网络&#xff08;RNN&#xff09;因其对序列数据处理的特性而备受关注。无论是自然语言处理、时间序列预测&#xff0c;还是语音识别&#xff0c;RNN都展现出了强大的能力。然而&#xff0c;RNN的内部机制及其在实际应用中的优…