-计算非终结符的FIRST集合-First集合-可以过和不能过的代码

1000. 计算非终结符的FIRST集合

 
 
Total:665Accepted:0
 
   
   
 

Time Limit: 1sec    Memory Limit:256MB

Description

 输入开始符号,非终结符,终结符,产生式;


输出每个非终结符的FIRST集合

Input

 输入开始符号;
非终结符个数,非终结符,空格符分隔;
终结符个数,终结符,空格符分隔;
产生式的个数,各产生式的序号,产生式的左边和右边符号,空格符分隔;

Output

 输出:

FIRST(VT) 换行

非终结符符号,FIRST(VT) 元素;每个符号后空格

Sample InputCopy

E
6  E A T B F D
10 + - / * / ( ) x y z 
13
1  E TA
2  A +TA
3  A -TA
4  A k
5  T FB
6  B *FB
7  B /FB
8  B k
9  F (E)
10 F D
11 D x
12 D y
13 D z

Sample OutputCopy

FIRST(VT)
E ( x y z 
A + - k 
T ( x y z 
B * / k 
F ( x y z 
D x y z 

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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值