题目1 : 虚拟游戏世界实体分析
时间限制:
5000ms
单点时限:
1000ms
内存限制:
256MB
-
Fruit{apple{shape,color},orange{taste,price}} Fruit Fruit{apple{shape,color},orange{taste,price}} orange Fruit{apple{shape,color},orange{color,price},color} color
样例输出
-
1 2
2,3
-
分析:
-
本题就是一个常规字符串处理题,找每个string的分割点,遇到{将层级加1,遇到}层级减1,然后匹配统计输出。
-
代码:
-
#include <iostream> #include <string> #include <vector> #include <string.h> using namespace std; struct OA { string name; int level; OA(string s,int l) { name = s; level = l; } }; vector<OA> VCWD; void add2vec(string s,int level)//将对象放入vector中 { const OA temp(s,level); auto it=VCWD.begin(); for(;it!=VCWD.end();it++)//查找vector中是否已经存在实体和层数相同的元素 { if(s == it->name && level == it->level) break; } if(VCWD.empty() || it == VCWD.end())//若不存在则添加 VCWD.push_back(temp); } void dealstringlevel(string &str, string word) { const char * strc = str.c_str();//转化string为const char * 方便处理 int level=1; string s = "";//暂存临时字符串 for(string::size_type i=0;i<str.length();i++) { if(strc[i] !='{'&&strc[i] !='}'&&strc[i] !=',') { s +=strc[i];//统计实体名 } else { if(s.length()) { add2vec(s,level); s = ""; } if(strc[i] =='{')//处理层级 level++; else if(strc[i] =='}') level--; } } for(auto it = VCWD.end()-1;it!=VCWD.begin()-1;it--) { if(it->name == word) cout << it->level<< " "; } cout << endl; } int main() { string one = "Fruit{apple{shape,color},orange{taste,price}}"; string two = "Fruit{apple{shape,color},orange{taste,price}}"; string three = "Fruit{apple{shape,color},orange{color,price},color}"; string word1 = "Fruit"; string word2 = "orange"; string word3 = "color"; dealstringlevel(one,word1); dealstringlevel(two,word2); dealstringlevel(three,word3); return 0; }
-
-
描述
虚拟游戏世界里面有很多实体,实体可能由很多子实体或者子属性构成。由于实体之间可能有非常之多的嵌套,查询某个实体或者属性属于第几层嵌套,以便将来对虚拟世界的修改和展示是一项待解决的问题,作为未来的虚拟世界分析员,你能用程序解决这个问题吗?
输入
输入数据可能由多组数据构成,每组数据由两行构成:
第一行是对虚拟世界的描述,实体或者属性由英文字母或者数字构成,子实体和子属性紧接着父实体嵌套在{}中,兄弟实体或者属性用“,”分隔。
第二行是要查询的属性或者实体,有且仅有一个。
注意数据输入可能很大。
输出
输出为查询的实体或者属性的层数;如果属性不存在,输出-1;如果有多个结果满足查询,请从小到大输出所有去重之后的结果,用”,”分隔