1000. 计算非终结符的FIRST集合 | ||||||
| ||||||
Time Limit: 1sec Memory Limit:256MB Description 输入开始符号,非终结符,终结符,产生式;
Input 输入开始符号; Output 输出: FIRST(VT) 换行 非终结符符号,FIRST(VT) 元素;每个符号后空格 Sample InputCopy Sample OutputCopy Problem Source: 8-计算非终结符的FIRST集合 |
#include <stdio.h>
#include<bits/stdc++.h>
using namespace std;
class First{
private:
char start;
int Vn_num;
int Vt_num;
int prodct_num;
vector<char>Vn;
vector<char>Vt;
vector<vector<string> >prodct;
vector<vector<char> >result;
public:
First(){
init();
}
bool isStartVt(string str){
char c = str[0];
for(int i=0;i<Vt.size();i++){
if(c==Vt[i]){
return true;
}
}
return false;
}
void show_vector(vector<char>v){
for(int i=0;i<v.size();i++){
cout << v[i] <<" ";
}
cout <<endl;
}
bool isHaveK(vector<char >v){
for(int i=0;i<v.size();i++){
if(v[i]=='k') return true;
}
return false;
}
vector<char> union_(vector<char>v1,vector<char>v2){
vector<char> v;
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end());
set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),back_inserter(v));
vector<char>::iterator it = v.begin();
for(;it != v.end();)
{
if(*it == 'k')
//删除指定元素,返回指向删除元素的下一个元素的位置的迭代器
it = v.erase(it);
else
//迭代器指向下一个元素位置
++it;
}
return v;
}
vector<char > find(char c){
// cout <<"strt -------- "<<c<<endl;
int p = pos(c);
vector<char> t_res;
for(int i=0;i<prodct[p].size();i++){
string str = prodct[p][i];
if(isStartVt(str) || c=='k' || str[0]=='k'){
t_res.push_back(str[0]);
}
else{
vector<char>temp = find(str[0]);
if(!isHaveK(temp)){
vector<char> t = temp;
for(int i=0;i<t.size();i++){
t_res.push_back(t[i]);
}
}
else if(isHaveK(temp)){
vector<char> t = union_(temp,find(str[1]));
for(int i=0;i<t.size();i++){
t_res.push_back(t[i]);
}
}
}
}
// if(t_res.size()!=0){
// cout <<" end -------- "<<c<<endl;
// show_vector(t_res);
// }
return t_res;
}
void search_result(){
result.resize(Vn.size());
for(int i=0;i<Vn.size();i++){
vector<char>temp = find(Vn[i]);
for(int j=0;j<temp.size();j++){
result[i].push_back(temp[j]);
}
}
}
int pos(char c){
for(int i=0;i<Vn.size();i++){
if(Vn[i]==c){
return i;
}
}
return -1;
}
void init(){
cin >> start;
cin >> Vn_num;
Vn.resize(Vn_num);
for(int i=0;i<Vn_num;i++){
cin >> Vn[i];
}
cin >> Vt_num;
Vt.resize(Vt_num);
for(int i=0;i<Vt_num;i++){
cin >> Vt[i];
}
cin >> prodct_num;
prodct.resize(Vn_num);
char t2;
string t1, t3;
for(int i=0;i<prodct_num;i++){
cin >> t1 >> t2 >>t3;
prodct[pos(t2)].push_back(t3);
}
}
void display(){
cout << "FIRST(VT)"<<endl;
for(int i=0;i<Vn.size();i++){
cout << Vn[i];
for(int j=0;j<result[i].size();j++){
cout << " "<<result[i][j];
}
cout << " "<<endl;
}
}
};
int main(){
First f1;
f1.search_result();
f1.display();
}
报了Presence Error错误
一个可以通过的代码
#include <stdio.h>
#include<bits/stdc++.h>
using namespace std;
#define endl "\r\n"
class First{
private:
char start;
int Vn_num;
int Vt_num;
int prodct_num;
vector<char>Vn;
vector<char>Vt;
vector<vector<string> >prodct;
vector<vector<char> >result;
public:
First(){
init();
}
bool isStartVt(string str){
char c = str[0];
for(int i=0;i<Vt.size();i++){
if(c==Vt[i]){
return true;
}
}
return false;
}
void show_vector(vector<char>v){
for(int i=0;i<v.size();i++){
cout << v[i] <<" ";
}
cout <<endl;
}
bool isHaveK(vector<char >v){
for(int i=0;i<v.size();i++){
if(v[i]=='k') return true;
}
return false;
}
vector<char> union_(vector<char>v1,vector<char>v2){
vector<char> v;
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end());
set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),back_inserter(v));
vector<char>::iterator it = v.begin();
for(;it != v.end();)
{
if(*it == 'k')
//删除指定元素,返回指向删除元素的下一个元素的位置的迭代器
it = v.erase(it);
else
//迭代器指向下一个元素位置
++it;
}
return v;
}
vector<char > find(char c){
// cout <<"strt -------- "<<c<<endl;
int p = pos(c);
vector<char> t_res;
for(int i=0;i<prodct[p].size();i++){
string str = prodct[p][i];
if(isStartVt(str) || c=='k' || str[0]=='k'){
t_res.push_back(str[0]);
}
else{
vector<char>temp = find(str[0]);
if(!isHaveK(temp)){
vector<char> t = temp;
for(int i=0;i<t.size();i++){
t_res.push_back(t[i]);
}
}
else if(isHaveK(temp)){
vector<char> t = union_(temp,find(str[1]));
for(int i=0;i<t.size();i++){
t_res.push_back(t[i]);
}
}
}
}
// if(t_res.size()!=0){
// cout <<" end -------- "<<c<<endl;
// show_vector(t_res);
// }
return t_res;
}
void search_result(){
result.resize(Vn.size());
for(int i=0;i<Vn.size();i++){
vector<char>temp = find(Vn[i]);
for(int j=0;j<temp.size();j++){
result[i].push_back(temp[j]);
}
}
}
int pos(char c){
for(int i=0;i<Vn.size();i++){
if(Vn[i]==c){
return i;
}
}
return -1;
}
void init(){
cin >> start;
cin >> Vn_num;
Vn.resize(Vn_num);
for(int i=0;i<Vn_num;i++){
cin >> Vn[i];
}
cin >> Vt_num;
Vt.resize(Vt_num);
for(int i=0;i<Vt_num;i++){
cin >> Vt[i];
}
cin >> prodct_num;
prodct.resize(Vn_num);
char t2;
string t1, t3;
for(int i=0;i<prodct_num;i++){
cin >> t1 >> t2 >>t3;
prodct[pos(t2)].push_back(t3);
}
}
void display(){
cout << "FIRST(VT)"<<endl;
for(int i=0;i<Vn.size();i++){
cout << Vn[i] << " ";
for(int j=0;j<result[i].size();j++){
cout <<result[i][j];
}
cout <<endl;
}
}
};
int main(){
First f1;
f1.search_result();
f1.display();
}