7-4 Chemical Equation (30 分)
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int maxn = 110;
struct product //生成物
{
vector<string> reactant; //可以生成product的反应物
vector<int> ans; //最终选的反应物
} Product[maxn];
int n, m, k;
bool isUsed[maxn], isExit[maxn],isPut[maxn]; //反应物是否使用,反应物是否存在,生成物也是反应物的情况是否加入
int rea[maxn], pro[maxn]; //反应物,生成物
map<int, vector<int>> ans;
int cnt = 0; //获取最终结果用
void DFS(int index) //index为当前为第index个生成物
{
if(index==m)
{
for (int i = 0; i < m;i++)
{
if(cnt!=m)
ans[cnt++] = Product[pro[i]].ans;
else
break;
}
}
if(cnt==m) //剪枝
return;
for (int i = 0; i < Product[pro[index]].reactant.size();i++)
{
string s = Product[pro[index]].reactant[i];
bool flag = true; //判断该反应物串是否可用
for (int j = 0; j < s.length();j+=2)
{
int v = stoi(s.substr(j, 2));
if(isUsed[v]==true||isExit[v]==false) //反应物v已经被用掉了或v不存在
flag = false;
}
if(flag==true)
{
Product[pro[index]].ans.clear();
for (int j = 0; j < s.length();j+=2)
{
int v = stoi(s.substr(j, 2));
isUsed[v] = true;
Product[pro[index]].ans.push_back(v);
}
DFS(index + 1);
for (int j = 0; j < s.length();j+=2)
{
int v = stoi(s.substr(j, 2));
isUsed[v] = false;
}
}
}
}
int main()
{
scanf("%d", &n);
memset(isExit, false, sizeof(isExit));
memset(isUsed, false, sizeof(isUsed));
memset(isPut, false, sizeof(isPut));
for (int i = 0; i < n; i++)
{
scanf("%d", &rea[i]);
isExit[rea[i]] = true;
}
scanf("%d", &m);
for (int i = 0; i < m;i++)
{
scanf("%d", &pro[i]);
string temp = to_string(pro[i]);
temp.insert(0, 2 - temp.size(), '0');
if(isExit[pro[i]]&&isPut[pro[i]]==false) //生成物也是反应物并且未加入过
{
Product[pro[i]].reactant.push_back(temp);
isPut[pro[i]] = true;
}
}
scanf("%d", &k);
getchar();
for (int i = 0; i < k;i++)
{
string s, t;
getline(cin, s);
for (int j = 0; j < s.length()-2;j++)
{
if(s[j]>='0'&&s[j]<='9')
t+=s[j]; //t为反应物串
}
int tempRea = stoi(s.substr(s.length() - 2, 2)); //生成物
Product[tempRea].reactant.push_back(t); //将反应物串存入
}
for (int i = 0; i < m;i++) //将每个生成物对应的各个反应物串降序排列
{
sort(Product[pro[i]].reactant.begin(), Product[pro[i]].reactant.end());
}
DFS(0);
for (auto it:ans)
{
printf("%02d", it.second[0]);
for (int j = 1; j < it.second.size();j++)
{
int v = it.second[j];
printf(" + %02d", v);
}
printf(" -> %02d\n", pro[it.first]);
}
return 0;
}
测试点2是关于反应物是否存在的,如果没判断反应物是否存在则测试点2错误
测试点4是考察当不给反应方程式并且反应物也是生成物时,应该有输出,例如
输入
1 01
1 01
0
应输出
01 -> 01