2020冬季pat甲 7-4 Chemical Equation (30 分)

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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值