CCF認證 201912-3 化學方程式 (100分)

CCF認證 201912-3 化學方程式 (100分)

題目大意也很容易懂,相比於往年的第三題,跟着模擬就好了。把()word,分解操作。

差幾行代碼300的我哭鳥= =

 

// INFO BEGIN
//
// User = 201911506529(俞夢真) 
// Group = C/C++ 
// Problem = 化學方程式 
// Language = CPP11 
// SubmitTime = 2019-12-15 16:42:38 
//
// INFO END

#include<iostream>
#include<cstring>
#include<map> 
using namespace std;
const int maxn=1000+10;
map<string,int> Lm,Rm;
//int Lnum[maxn],Rnum[maxn];
//string Ls[max],Rs[maxn];
//是數字 
bool isnum(char c){
	if(c<='9'&&c>='0') return 1;
	return 0;
}
//小寫字母 
bool issmall(char c){
	if(c<='z'&&c>='a') return 1;
	return 0;
}
//大寫字母 
bool isbig(char c){
	if(c<='Z'&&c>='A') return 1;
	return 0;
}
void oneword(string str,bool flag,int num){
	int len=str.size();
	int cnt=1,i=0;
	string tmp="";
	int tmp1=-1;
	while(isnum(str[i])&&i<len){
		if(i==0) cnt=str[i]-'0';
		else cnt=cnt*10+str[i]-'0';		
		i++;
	}//最前面的係數 
	cnt=cnt*num;
//	cout<<str<<" "<<num<<" "<<cnt<<endl;
	for(;i<len;i++){
		if(str[i]=='+'&&tmp!=""){
			if(tmp1==-1) tmp1=1;
			if(!flag) Lm[tmp]=Lm[tmp]+tmp1*cnt;
			else Rm[tmp]=Rm[tmp]+tmp1*cnt;
			tmp1=-1;tmp="";
		}
		else if(isnum(str[i])){
			if(tmp1==-1) tmp1=str[i]-'0';
			else tmp1=tmp1*10+str[i]-'0';
		}
		else if(str[i]=='('){
			if(tmp!=""){
				if(tmp1==-1) tmp1=1;
				if(!flag) Lm[tmp]=Lm[tmp]+tmp1*cnt;
				else Rm[tmp]=Rm[tmp]+tmp1*cnt;
				tmp1=-1;tmp="";//總結一下前面的
			}
            int x=1;//考試的時候沒有加這個對嵌套處理 得分80= =唉 就差幾行
			for(int j=i+1;j<len;j++){
				if(str[j]==')'){
					x--;
                    if(x==0){
                        i=j+1;break;
                    }
				}
                else if(str[j]=='(') x++;//
				tmp+=str[j];
			}
			//加上()後的數字
			int tmp2=-1;
			while(isnum(str[i])&&i<len){
				if(tmp2==-1) tmp2=str[i]-'0';
				else tmp2=tmp2*10+str[i]-'0';
				i++;
			} 
			if(tmp2==-1) tmp2=1;
			oneword(tmp,flag,tmp2*cnt);
			i--;// 因爲等下還要i++ 
			tmp1=-1;tmp="";//總結一下前面的
		}
		else {
			if(isbig(str[i])&&tmp.size()>0){
				if(tmp1==-1) tmp1=1;
				if(!flag) Lm[tmp]=Lm[tmp]+tmp1*cnt;
				else Rm[tmp]=Rm[tmp]+tmp1*cnt;
				tmp1=-1;tmp=str[i];
			}
			else tmp+=str[i];
		}
	}
	
	//最後一個
	if(tmp!=""){
		if(tmp1==-1) tmp1=1;
		if(!flag) Lm[tmp]=Lm[tmp]+tmp1*cnt;
		else Rm[tmp]=Rm[tmp]+tmp1*cnt;
	}
}
void find(string str,bool flag){
	int len=str.size();
	string tmp="";
	for(int i=0;i<len;i++){
		if(str[i]=='+'){
			oneword(tmp,flag,1);
			tmp="";
		}
		else tmp+=str[i];
	}
	if(tmp!=""){
		oneword(tmp,flag,1);
	}
}


int main(){
	int n;
	string str;
	cin>>n;
	while(n--){
		cin>>str;
		Lm.clear();
		Rm.clear();
		int len=str.size();
		for(int i=0;i<len;i++){
			if(str[i]=='='){
				find(str.substr(0,i),0);
				find(str.substr(i+1,len),1);
				break;
			}
		}
		int flag=0;
		for(map<string,int>::iterator it=Lm.begin();it!=Lm.end();it++){
//			cout<<it->first<<" "<<it->second<<endl; //
//			cout<<Rm[it->first]<<endl;//
			if(Rm[it->first]==it->second) Rm[it->first]=0;
			else {
				flag=1;break;	
			}
		}
		for(map<string,int>::iterator it=Rm.begin();it!=Rm.end();it++){
			if(it->second!=0) {
//				cout<<":"<<it->first<<": "<<it->second<<endl; //
				flag=1;break;	
			}
		}
		if(!flag) cout<<"Y"<<endl;
		else cout<<"N"<<endl;
	}
	return 0;
}

/*
11
4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH
4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O
H2+O2=H2O
2H2+O2=2H2O
H2+Cl2=2NaCl
H2+Cl2=2HCl
CH4+2O2=CO2+2H2O
CaCl2+2AgNO3=Ca(NO3)2+2AgCl
3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2
3Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O
Cu+As=Cs+Au
*/

 

發佈了312 篇原創文章 · 獲贊 112 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章