//ch1存储化学方程式,ch2存储已有试制品(前M个为输入的试制品)
//left和right分别存储一个化学方程式的反应物和生成物
//思路:检查ch1中每个方程式的反应物是否都在已有试制品中,
//如都在,把生成物加入试制品,最后排序输出
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
int cmp(const void *_a, const void *_b);
class data
{
public:
bool input();
void separate(int );
void insert();
void run();
void output();
private:
int N;
int M;
int rear;
char ch1[410][110];//化学方程式
char ch2[10000][15];//已有试制品和生成的新试制品
char left[25][11];
char right[25][11];
int left_num;
int right_num;
};
int main()
{
data a;
while(a.input())
{
a.run();
a.output();
}
}
bool data::input()
{
if(cin >> N)
{
for(int i = 1; i <= N; i++) //输入反应方程式
{
cin >> ch1[i];
}
cin >> M;
for(int i = 1; i <= M; i++) //输入已有试制品
{
cin >> ch2[i];
}
rear = M;
return true;
}
return false;
}
void data::separate(int cur)
{
int i, j;
left_num = 0;
right_num = 0;
j = 0;
for(i = 0; ch1[cur][i] != '='; i++) //分解反应物
{
if(ch1[cur][i] != '+')
{
left[left_num][j++] = ch1[cur][i];
}
else
{
left[left_num][j] = 0;
j = 0;
left_num++;
}
}
left[left_num][j] = 0;
j = 0;
for(i++; ch1[cur][i] != '\0'; i++) //分解生成物
{
if(ch1[cur][i] != '+')
{
right[right_num][j++] = ch1[cur][i];
}
else
{
right[right_num][j] = 0;
j = 0;
right_num++;
}
}
right[right_num][j] = 0;
left_num++;
right_num++;
}
void data::insert()
{
int i, j;
int flag = 0;
for(i = 0; i < left_num; i++)
{
flag = 0;
for(j = 1; j <= rear; j++)
{
if(strcmp(left[i], ch2[j]) == 0)
{
flag = 1;
break;
}
}
if(flag == 0)
break;
}
if(flag == 1)
{
int t = 0;
for(i = 0; i < right_num; i++)
{
t = 0;
for(j = 1; j <= rear; j++)
{
if(strcmp(right[i], ch2[j]) == 0)
{
t = 1;
break;
}
}
if(t == 0)
strcpy(ch2[++rear], right[i]);
}
}
}
void data::run()
{
int i;
for(i = 1; i <= N; i++)
{
separate(i);
insert();
}
}
void data::output()
{
qsort(&ch2[M+1], rear - M, sizeof(ch2[0]), cmp);
cout << rear - M << endl;
for(int i = M+1; i <= rear; i++)
cout << ch2[i] << endl;
}
int cmp(const void *_a, const void *_b)
{
char *a = (char *)_a;
char *b = (char *)_b;
return strcmp(a, b);
}
南阳理工OJ_题目542 试 制 品
最新推荐文章于 2021-05-07 15:08:30 发布