就写的挺垃圾的。。。
/*
* @author: codancer
* @createTime: 2020-11-28, 14:41:28
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <queue>
#include <ctime>
#include <cassert>
#include <complex>
#include <string>
#include <cstring>
#include <chrono>
#include <random>
#include <bitset>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll mod = 1e9+7;
#define pb push_back
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define fep(i,a,b) for(int i=(a);i>=(b);i--)
#define deb(x) cerr<<#x<<" = "<<(x)<<"\n"
typedef vector<int> VI;
typedef vector<ll> VII;
typedef pair<int,int> pii;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll Rand(ll B) {
return (ull)rng() % B;
}
/*
数据库格式为若干组,每组由n个条件,组成,最后一行为结果,存放在data.txt中
*/
// map<string,int> conditions;//为每个条件分配编号
map<string,vector<string> > rules;//用一个对于每个生成式需要若干条件
int main(){
freopen("data.txt","r",stdin);
/*
初始化阶段
*/
bool flag=0;
int n;
while(cin>>n){
flag=1;
vector<string> fac(n);//条件
for(int i=0;i<n;i++) cin>>fac[i];
// for(string v:fac) cout<<v<<endl;
string res;//生成式结果
cin>>res;
rules[res]=fac;//建立对应关系
}
vector<string> animals={"金钱豹","虎","长颈鹿","鸵鸟","企鹅","信天翁"};
if(flag){
cout<<"数据关系初始化成功!"<<endl;
for(auto v:rules){
string res=v.first;
vector<string> pre=v.second;
int siz=(int)pre.size();
for(int i=0;i<siz-1;i++) cout<<pre[i]<<" & ";
cout<<pre[siz-1]<<" --> "<<res<<endl;
}
cout<<endl;
}
else{
cout<<"数据关系为空!"<<endl;
}
fclose(stdin);
cin.clear();
freopen("test.txt","r",stdin);
/*
输入阶段
*/
cout<<"输入特征个数:"<<endl;
cin>>n;
cout<<n<<endl;
cout<<"每行输入一个特征"<<endl;
set<string> conditions;//当前特征集合
for(int i=1;i<=n;i++){
string s;
cin>>s;
conditions.insert(s);
}
for(auto v:conditions) cout<<v<<endl;
/*
产生式推导算法
*/
while(1){
int now_siz=(int)conditions.size();//当前特征集合大小
for(auto v:rules){
string res=v.first;//产生式结果
vector<string> pre=v.second;
bool suc=1;
for(string v:pre){
if(conditions.find(v)==conditions.end()){
suc=0;
break;
}
}
if(suc) conditions.insert(res);//若满足当前产生式条件,则加入新的关系
}
if(conditions.size()==now_siz){//若没有
break;
}
}
cout<<"-----------------------------------"<<endl;
cout<<"该动物为: "<<endl;
for(string v:conditions){
for(string u:animals){
if(v==u) cout<<u<<endl;
}
}
return 0;
}