• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            hnu 10076 Jimmy's Riddles DFA

               句子的語法匹配。這個用DFA確實可以很方便做出來,用遞歸判斷之類的應(yīng)該也可以。
               感覺用dfa只需要保證狀態(tài)轉(zhuǎn)換圖對了,基本上就不會出bug了,但是其它的方法去匹配
            這種類似正則表達式的字符串就容易出錯多了。

               百度百科的DFA定義如下:
                  英文全稱:Deterministic Finite Automaton, 簡寫:DFA
              DFA定義:一個確定的有窮自動機(DFA)M是一個五元組:M=(K,Σ,f,S,Z)其中
              ① K是一個有窮集,它的每個元素稱為一個狀態(tài);
              ② Σ是一個有窮字母表,它的每個元素稱為一個輸入符號,所以也稱Σ為輸入符號字母表;
              ③ f是轉(zhuǎn)換函數(shù),是K×Σ→K上的映射,即,如 f(ki,a)=kj,(ki∈K,kj∈K)就意味著,
            當(dāng)前狀態(tài)為ki,輸入符為a時,將轉(zhuǎn)換為下一個狀態(tài)kj,我們把kj稱作ki的一個后繼狀態(tài);
              ④ S ∈ K是唯一的一個初態(tài);
              ⑤ Z⊂K是一個終態(tài)集,終態(tài)也稱可接受狀態(tài)或結(jié)束狀態(tài)。

               該題的狀態(tài)轉(zhuǎn)換圖:
               
               現(xiàn)在再根據(jù)狀態(tài)轉(zhuǎn)換圖,寫一個模擬轉(zhuǎn)換關(guān)系的匹配就非常方便了。。。
               代碼如下:
            #include <string>
            #include <vector>
            #include <sstream>
            #include <iostream>
            #include <algorithm>
            using namespace std;

            string strNouns[8] =
            {
                "tom", "jerry", "goofy", "mickey",
                "jimmy", "dog", "cat", "mouse"
            };

            bool IsNoun(string& str)
            {
                for (int i = 0; i < 8; ++i)
                {
                    if (str == strNouns[i])
                    {
                        return true;
                    }
                }
                return false;
            }

            bool IsVerb(string& str)
            {
                return str == "hate" || str == "love"
                        || str == "know" || str == "like"
                        || str == "hates" || str == "loves"
                        || str == "knows" || str == "likes"; 
            }

            bool IsArticle(string& str)
            {
                return str == "a" || str == "the";
            }

            bool CheckState(vector<string>& vs)
            {
                if (vs.empty()) return false;
                
                int nState = 0;
                for (int i = 0; i < vs.size(); ++i)
                {
                    //printf("nState:%d, str:%s\n", nState, vs[i].c_str());
                    switch (nState)
                    {
                        case 0:
                            if (IsArticle(vs[i]))
                            {
                                nState = 1;
                                break;
                            }
                            else if (IsNoun(vs[i]))
                            {
                                nState = 2;
                                break;
                            }
                            else
                            {
                                return false;
                            }
                            
                        case 1:
                            if (IsNoun(vs[i]))
                            {
                                nState = 2;
                                break;
                            }
                            else
                            {
                                return false;
                            }
                            
                        case 2:
                            if (vs[i] == "and")
                            {
                                nState = 0;
                                break;
                            }
                            else if (IsVerb(vs[i]))
                            {
                                nState = 3;
                                break;
                            }
                            else
                            {
                                return false;
                            }
                            
                        case 3:
                            if (IsArticle(vs[i]))
                            {
                                nState = 4;
                                break;
                            }
                            else if (IsNoun(vs[i]))
                            {
                                nState = 5;
                                break;
                            }
                            else
                            {
                                return false;
                            }
                            
                        case 4:
                            if (IsNoun(vs[i]))
                            {
                                nState = 5;
                                break;
                            }
                            else
                            {
                                return false;
                            }
                            
                        case 5:
                            if (vs[i] == "and")
                            {
                                nState = 3;
                                break;
                            }
                            else if (vs[i] == ",")
                            {
                                nState = 0;
                                break;
                            }
                            else
                            {
                                return false;
                            }
                    }
                }
                
                return nState == 5;
            }

            int main()
            {
                int nT;
                
                scanf("%d%*c", &nT);
                while (nT--)
                {
                    vector<string> vs;
                    string line, str;
                    
                    getline(cin, line);
                    stringstream ss(line);
                    while (ss >> str)
                    {
                        vs.push_back(str);
                    }
                    printf("%s\n", CheckState(vs) ? "YES I WILL" : "NO I WON'T");
                }
                
                return 0;
            }

            posted on 2012-10-12 22:14 yx 閱讀(1053) 評論(2)  編輯 收藏 引用 所屬分類: 字符串

            評論

            # re: hnu 10076 Jimmy's Riddles DFA 2012-10-12 22:54 klion26

            Orz!  回復(fù)  更多評論   

            # re: hnu 10076 Jimmy's Riddles DFA 2012-10-12 22:56 遠行

            膜拜大哲@klion26
              回復(fù)  更多評論   

            <2012年3月>
            26272829123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導(dǎo)航

            統(tǒng)計

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學(xué)

            網(wǎng)友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            一级a性色生活片久久无少妇一级婬片免费放 | 久久久99精品成人片中文字幕| 66精品综合久久久久久久| 深夜久久AAAAA级毛片免费看| 亚洲伊人久久综合影院| 国产精品久久毛片完整版| 欧美粉嫩小泬久久久久久久 | 久久婷婷成人综合色综合| 亚洲狠狠久久综合一区77777| 国内精品久久久久久中文字幕| 狠狠色婷婷久久综合频道日韩 | 久久国产亚洲高清观看| 精品久久久久久无码人妻蜜桃| 伊人久久大香线蕉AV色婷婷色| 91久久九九无码成人网站| 亚洲中文字幕无码久久综合网 | 亚洲伊人久久综合中文成人网| 久久99国产精品二区不卡| 亚洲AV无码久久精品色欲| 久久久91人妻无码精品蜜桃HD| 国产一久久香蕉国产线看观看| 久久精品国产99国产精品导航| 久久人人爽人人澡人人高潮AV| 狠狠久久亚洲欧美专区| 亚洲AV无码成人网站久久精品大| 欧美亚洲日本久久精品| 久久精品国产72国产精福利| 国产欧美久久一区二区| 久久精品国产久精国产思思 | 99久久精品国产一区二区| 国产69精品久久久久777| 欧美va久久久噜噜噜久久| 亚洲av伊人久久综合密臀性色 | 久久精品国产欧美日韩99热| 精品国产热久久久福利| 亚洲伊人久久大香线蕉苏妲己| 久久亚洲国产午夜精品理论片| 久久99精品国产自在现线小黄鸭 | 18岁日韩内射颜射午夜久久成人 | 亚洲天堂久久精品| 久久久久国色AV免费看图片|