血型判断 II《编程思维与实践》个人学习笔记"/>
测试 1115. 血型判断 II《编程思维与实践》个人学习笔记
题目
思路
用map<string,string>来做这个题目最方便了,开两个map分别用来表示
血型->遗传因子
遗传因子->血型的映射
然后穷举所有可能即可(注意排列组合的组合前后顺序)
代码
#include <iostream>
#include<bits/stdc++.h>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cctype>
#include<stdlib.h>
#include<cstdio>using namespace std;int main()
{string f,m,s;cin >> f >> m >> s;map<string,string>xue;xue["AA"] = "A";xue["AO"] = "A";xue["OA"] = "A";xue["AB"] = "AB";xue["BA"] = "AB";xue["BB"] = "B";xue["BO"] = "B";xue["OB"] = "B";xue["OO"] = "O";map<string,vector<char>>yin;yin["A"].push_back('A');yin["A"].push_back('O');yin["AB"].push_back('A');yin["AB"].push_back('B');yin["B"].push_back('B');yin["B"].push_back('O');yin["O"].push_back('O');if(s == "?"){set<string> vv;set<string> maybe;string s;for(auto y : yin[m]){for(auto x:yin[f]){s = "";s += y;s += x;vv.insert(s);}}for(auto x : vv){//cout << x << endl;maybe.insert(xue[x]);}cout << f << " " << m << " ";cout << "{";int len = maybe.size();string * ss = new string[len];int i = 0;for(set<string>::iterator x = maybe.begin(); x != maybe.end(); x++, i++)ss[i] = *x;for(int i= 0; i < len - 1; i++)cout << ss[i] <<",";cout << ss[len - 1] << '}';}else if(m == "?"){vector<string> v;map<string,int> mm;mm["A"] = mm["AB"] = mm["O"] = mm["B"] = 0;for(auto x : yin[f]){string str = "";for(auto y : yin["A"]){str+=x;str+=y;//得到可能的孩子的血型;if(xue[str] == s){mm["A"]+=1;}str = "";str+=y;str+=x;//得到可能的孩子的血型;if(xue[str] == s){mm["A"]+=1;}}str = "";for(auto y : yin["AB"]){str+=x;str+=y;//得到可能的孩子的血型;if(xue[str] == s){mm["AB"]+=1;}str = "";str+=y;str+=x;//得到可能的孩子的血型;if(xue[str] == s){mm["AB"]+=1;}}str = "";for(auto y : yin["B"]){str+=x;str+=y;//得到可能的孩子的血型;if(xue[str] == s){mm["B"]+=1;}str = "";str+=y;str+=x;//得到可能的孩子的血型;if(xue[str] == s){mm["B"]+=1;}}str = "";for(auto y : yin["O"]){str+=x;str+=y;//得到可能的孩子的血型;if(xue[str] == s){mm["O"]+=1;}str = "";str+=y;str+=x;//得到可能的孩子的血型;if(xue[str] == s){mm["O"]+=1;}}}int flag = true;set<string> ss;if(mm["O"] == 0 && mm["AB"] == 0 && mm["B"] == 0 && mm["A"] == 0 )flag = false;if(mm["A"] != 0)ss.insert("A");if(mm["AB"] != 0)ss.insert("AB");if(mm["B"] != 0)ss.insert("B");if(mm["O"] != 0)ss.insert("O");cout << f << " ";if(!flag) cout << "impossible" << " " << s <<endl;else{int len = ss.size(); int i = 0;string *sp = new string[len];for(auto it = ss.begin(); it != ss.end(); it++, i++)sp[i] = *it;cout << "{";for(int i = 0; i < len - 1; i++)cout << sp[i]<<",";cout << sp[len - 1] << "}";cout << " " <<s<<endl;}}
else if(f == "?"){vector<string> v;map<string,int> mm;mm["A"] = mm["AB"] = mm["O"] = mm["B"] = 0;for(auto x : yin[m]){string str = "";for(auto y : yin["A"]){str+=x;str+=y;//得到可能的孩子的血型;if(xue[str] == s){mm["A"]+=1;}str = "";str+=y;str+=x;//得到可能的孩子的血型;if(xue[str] == s){mm["A"]+=1;}}str = "";for(auto y : yin["AB"]){str+=x;str+=y;//得到可能的孩子的血型;if(xue[str] == s){mm["AB"]+=1;}str = "";str+=y;str+=x;//得到可能的孩子的血型;if(xue[str] == s){mm["AB"]+=1;}}str = "";for(auto y : yin["B"]){str+=x;str+=y;//得到可能的孩子的血型;if(xue[str] == s){mm["B"]+=1;}str = "";str+=y;str+=x;//得到可能的孩子的血型;if(xue[str] == s){mm["B"]+=1;}}str = "";for(auto y : yin["O"]){str+=x;str+=y;//得到可能的孩子的血型;if(xue[str] == s){mm["O"]+=1;}str = "";str+=y;str+=x;//得到可能的孩子的血型;if(xue[str] == s){mm["O"]+=1;}}}int flag = true;set<string> ss;if(mm["O"] == 0 && mm["AB"] == 0 && mm["B"] == 0 && mm["A"] == 0 )flag = false;if(mm["A"] != 0)ss.insert("A");if(mm["AB"] != 0)ss.insert("AB");if(mm["B"] != 0)ss.insert("B");if(mm["O"] != 0)ss.insert("O");if(!flag) cout << "impossible" << " " << m << " " <<s << endl;else{int len = ss.size(); int i = 0;string *sp = new string[len];for(auto it = ss.begin(); it != ss.end(); it++, i++)sp[i] = *it;cout << "{";for(int i = 0; i < len - 1; i++)cout << sp[i]<<",";cout << sp[len - 1] << "}";cout << " " <<m << " " << s << endl;;}}}
更多推荐
测试 1115. 血型判断 II《编程思维与实践》个人学习笔记
发布评论