-計算非終結符的FIRST集合-First集合-可以過和不能過的代碼

1000. 計算非終結符的FIRST集合

 
 
Total: 665 Accepted: 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();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章