青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

huaxiazhihuo

 

玩具代碼 24點(diǎn)游戲

        所謂24點(diǎn),就是甩出幾個整數(shù),整數(shù)之間沒有固定的前后順序,給它們添加上加減乘除括號等,形成一條式子,最后運(yùn)算結(jié)果等于24。很自然的想法,就是祭出表達(dá)式樹。但24點(diǎn)只是一個小程序,用表達(dá)式樹來解決,實(shí)在有點(diǎn)大材小用了,太委屈表達(dá)式樹了,所以堅決抵制。
        瀏覽各網(wǎng)友們的24點(diǎn)文章,發(fā)現(xiàn)大多數(shù)都在用最笨拙的窮舉法寫程序,或者是先搞成字符串,然后再對字符串求值,毫無新意,代碼風(fēng)格也差,都是四五重循環(huán),難以擴(kuò)充。用窮舉法也沒什么不好,但是,就算是窮舉,也要窮舉得漂漂亮亮,雖不能遺漏,但也不要重復(fù),然后代碼中也不能寫死了,要保持一定的擴(kuò)充性。不過得承認(rèn),不管怎么樣,他們終究還是寫出了24點(diǎn)的代碼。
        24點(diǎn)粗看起來似乎有點(diǎn)棘手。但很容易就可以發(fā)現(xiàn)一種很自然的方法,假如4個整數(shù)參與24點(diǎn)了,那么就從中取出兩個數(shù),進(jìn)行加減乘除之后合成一個數(shù),放回去,于是4個數(shù)變成3個數(shù),再用同樣的辦法使這每一排3個數(shù)的組合變成兩個數(shù),最后就只剩下兩個數(shù),稍一運(yùn)算,很容易就可以判斷兩個數(shù)能否湊成24。很容易就看得出來,這屬回溯法,最適合寫成遞歸的形式。但是,這一次的遞歸,要用代碼表達(dá)出來,卻著實(shí)有點(diǎn)不容易。不過,只要有了算法,總是有辦法寫成代碼。為了加深難度,也為效率,我也不打算在代碼中用到遞歸。
        一般來說,回溯法屬深度優(yōu)先搜索法,它從問題領(lǐng)域中選取一個狀態(tài)作為當(dāng)前節(jié)點(diǎn),進(jìn)行某一種運(yùn)算之后,形成下一級的狀態(tài),作為節(jié)點(diǎn),再進(jìn)行某種運(yùn)算,再形成下下級的狀態(tài),作為根據(jù)地,再嘗試新的節(jié)點(diǎn),直到?jīng)]有可用的節(jié)點(diǎn)了,稱為葉子,就判斷此時的狀態(tài)是否滿足問題的解。不滿足,退回父節(jié)點(diǎn),進(jìn)行運(yùn)算,進(jìn)入下一級的狀態(tài),繼續(xù)深度搜索。如果父節(jié)點(diǎn)無法進(jìn)入新的狀態(tài),那么只好退回祖父節(jié)點(diǎn),進(jìn)行同樣的操作。所以回溯算法的關(guān)鍵,在于新狀態(tài)的運(yùn)算代碼,和各級節(jié)點(diǎn)的保存恢復(fù)代碼。
        再看看24點(diǎn)的問題,為便于行文,假設(shè)只有4個數(shù)參與運(yùn)算。先來考察第一級狀態(tài)的節(jié)點(diǎn)數(shù)量。首先,從4個數(shù)中任意取出兩個數(shù),共有C(4,2) = 6 種組合,兩個數(shù)a和b,利用加減乘除和交換位置,可以湊出6個結(jié)果,分別為a+b,a*b,b-a,a/b,a-b,b/a。于是,第一級狀態(tài)就有36節(jié)點(diǎn)。同理類推,第二級狀態(tài)有C(3,2)*6,第三級狀態(tài)有C(2,2)*6,沒有第四級了,第三級的節(jié)點(diǎn),全部都是葉子,都要判斷。這意味著,24點(diǎn)算法中,存在36*18*6片葉子需要判斷。此外,24點(diǎn)中,4個數(shù)的狀態(tài)級數(shù)為3,可以預(yù)料到24點(diǎn)中狀態(tài)的級數(shù)比輸入?yún)?shù)的數(shù)目少1,你應(yīng)該知道WHY的。
        由以上分析可知,每一級的狀態(tài),由3個參數(shù)決定,分別是第1個數(shù)a、第2個數(shù)b和運(yùn)算符號。運(yùn)算符號取值范圍為0-5,分別表示a+b,a-b,a*b,a/b,b-a,b/a這6種運(yùn)算。這3個參數(shù)是一個整體,代碼中用Step來表示,分別為nFst,nSnd,nOper。
……
        忽略了思考過程,下面簡單說明代碼結(jié)構(gòu)。CGame24是主類,用以玩出24點(diǎn)游戲的解。其成員函數(shù)CalcNextResult()在內(nèi)部狀態(tài)中用輸入的數(shù)構(gòu)造出一個最終的表達(dá)式,這個表達(dá)式可能是正確的解,也可能不是。而Play()則通過調(diào)用不停地調(diào)用CalcNextResult()以嘗試得到一個正確的解。Express()則將表達(dá)式表示成字符串的形式。m_Nums用以儲存原始的輸入數(shù)據(jù)和中間運(yùn)算結(jié)果,其中最后的一個數(shù)為表達(dá)式的最終運(yùn)算結(jié)果。m_Flags用以指示m_Nums中的數(shù)是否已參與表達(dá)式中,以阻止同一個數(shù)多次進(jìn)入表達(dá)式中。
        于是Step中的nFst,nSnd為m_Nums中的數(shù)的索引,很明顯,由于是組合關(guān)系,所以nSnd必將大于nFst。Step中還有一個nNext的變量,指向的是nSnd的下一個可用的索引,當(dāng)nOper為最后一種運(yùn)算時,nSnd就要進(jìn)入到下一個位置了,也就是被賦予nNext的值。如果nNext沒有可用的值時,就表示要改變nFst的下標(biāo)了。本來nNext的出現(xiàn)是為了將代碼寫得好看一點(diǎn)而硬造出來的一個變量,但不料在后面,卻發(fā)揮了很重要的作用,簡直是假如沒有它,代碼就沒法編了。
        整片程序的壓力全在Step::ToNext()上,它所做的事情,不過是為了使?fàn)顟B(tài)進(jìn)入下一個狀態(tài)中。但是其實(shí)現(xiàn),卻異常復(fù)雜,要考慮組合的各種可能的情況,甚至還要考慮除數(shù)是否為0。承擔(dān)了太多的職責(zé),但是我也想不出更好的方式,也不打算再思考了。
        好吧,我也承認(rèn)代碼寫得異常糟糕,不過,這只是玩具代碼,原本就不愿精雕細(xì)刻,它還存在好多不足之處,比如輸出結(jié)果中,有時會加入多余的括號,這個問題還能解決。然后,它還不夠智能,遍歷出來的一些解,其本質(zhì)上看還是相同,這個的解決就很有點(diǎn)難度了。此外,按抽象的觀點(diǎn)來看,回溯算法其實(shí)相當(dāng)于一個容器,它的循環(huán)遍歷葉子節(jié)點(diǎn)或者解,可看成迭代器,這種思路,完全可以表達(dá)成C++的代碼等等。如果讀者愿意優(yōu)化,請將優(yōu)化后的結(jié)果發(fā)給在下,在下也很想瞅瞅。其實(shí),我想說的是,就算老夫親自操刀,也不見得就勝過一眾宵小了,慚愧。
        算法這東西,現(xiàn)實(shí)中用得很少,高效復(fù)雜的算法自然有人在研究,我們只要注意將代碼寫得清晰一點(diǎn)就好了。不過,話又說回來,經(jīng)過各種算法狂轟濫炸后的大腦,編出來的代碼,貌似比沒有經(jīng)過算法折磨過的人,似乎總是要強(qiáng)一點(diǎn)。
#include <stdio.h>
#include 
<math.h>
#include 
<assert.h>
#include 
<utility>
#include 
<iostream>

using namespace std;

unsigned 
int gcd(unsigned int x, unsigned int y)   
{   
    unsigned  
int  nTimes=0;   
    
for (; 0 == (x&1&& 0 == (y&1); x>>=1, y>>=1)
        
++nTimes;

    
if (x < y)
        swap(x, y);

    
while (y > 0)
    
{
        
for (; 0 == (x & 1 );x >>= 1 )
            ;   

        
if (x < y)
            swap(x, y);
        x 
-= y;
        
if (x < y)
            swap(x, y);
    }

    
return x << nTimes;
}
 


class CRational
{
public:
    CRational(
int nNumberator=0int nDenominator=1)
        : m_nNum(nNumberator), m_nDe(nDenominator)
    
{
        assert(nDenominator 
!= 0);
        standarlize();
    }

    
int Numberator()const return m_nNum;}
    
int Denominator()const return m_nDe;}

    CRational
& operator+=(const CRational& _Right)
    
{
        m_nNum 
= m_nNum*_Right.m_nDe + _Right.m_nNum*m_nDe;
        m_nDe 
*= _Right.m_nDe;
        standarlize();
        
return *this;
    }


    CRational
& operator-=(const CRational& _Right)
    
{
        m_nNum 
= m_nNum*_Right.m_nDe - _Right.m_nNum*m_nDe;
        m_nDe 
*= _Right.m_nDe;
        standarlize();
        
return *this;
    }


    CRational
& operator*=(const CRational& _Right)
    
{
        m_nNum 
*= _Right.m_nNum;
        m_nDe 
*= _Right.m_nDe;
        standarlize();
        
return *this;
    }


    CRational
& operator/=(const CRational& _Right)
    
{
        assert(_Right.Denominator() 
!= 0);
        m_nNum 
*= _Right.m_nDe;
        m_nDe 
*= _Right.m_nNum;
        standarlize();
        
return *this;
    }


private:
    
void standarlize()
    
{
        
if (m_nDe < 0)
        
{
            m_nDe 
= -m_nDe;
            m_nNum 
= -m_nNum;
        }

        
int nGcd = gcd(abs(m_nNum), m_nDe);
        m_nNum 
/= nGcd;
        m_nDe 
/= nGcd;
    }

    
int m_nNum;
    
int m_nDe;
}
;

ostream
& operator << (ostream& outconst CRational& rat)
{
    cout 
<< rat.Numberator();
    
if (rat.Denominator() != 1)
        cout 
<< "/" << rat.Denominator();
    
return out;
}


CRational 
operator-(const CRational& _Left, const CRational& _Right)
{
    CRational _Tmp(_Left);
    
return _Tmp -= _Right;
}


CRational 
operator+(const CRational& _Left, const CRational& _Right)
{
    CRational _Tmp(_Left);
    
return _Tmp += _Right;
}


CRational 
operator*(const CRational& _Left, const CRational& _Right)
{
    CRational _Tmp(_Left);
    
return _Tmp *= _Right;
}


CRational 
operator/(const CRational& _Left, const CRational& _Right)
{
    CRational _Tmp(_Left);
    
return _Tmp /= _Right;
}


bool operator==(const CRational& _Left, const CRational& _Right)
{
    
return _Left.Numberator()==_Right.Numberator() && _Left.Denominator()==_Right.Denominator();
}


enum OperType{ OPER_ADD, OPER_SUB1, OPER_MUL, OPER_DIV1, OPER_SUB2, OPER_DIV2};

const char* g_sOPER_SYMBOL = "+-*/-/";
class CGame24
{
public:
    CGame24(
int nRes, int* pNums, int nLen);

    
bool Play();
    
bool CalcNextResult();
    size_t Express(
char* pExp);

private:
    
struct Step
    
{
        
char nOper;
        
char nFst;
        
char nSnd;
        
char nNext;

        
void ToNext(bool* pFlags, const CRational* pNums, int nMax);

        
bool HasNext(const bool* pFlags, int nMax)
        
{
            
if (nNext >= nMax)
            
{
                
int nCount = 0;
                
for (char i = nFst+1; i < nSnd && nCount<2; i++)
                
{
                    
if (!pFlags[i])
                        nCount
++;
                }

                
return nCount == 2;
            }

            
return true;
        }


        
void Discard(bool* pFlags)
        
{
            pFlags[nFst] 
= false;
            pFlags[nSnd] 
= false;
            nFst 
= 0;
            nSnd 
= 0;
            nNext 
= 0;
        }

    }
;

    size_t buildExpress(
char* pExp, char nStep, char nSuperOper);

    
enum {_nSIZE = 100};
    CRational m_Nums[_nSIZE
*2];
    
bool m_Flags[_nSIZE*2];
    Step m_Steps[_nSIZE];
    
int m_nRes;
    
char m_nLen;
    
char m_nCur;
}
;

void CGame24::Step::ToNext(bool* pFlags, const CRational* pNums, int nMax)
{
    assert(HasNext(pFlags, nMax));
    
if (nNext == nMax)
    
{
        pFlags[nFst] 
= false;
        pFlags[nSnd] 
= false;
        nOper 
= 0;
        nNext 
= 0;
        nFst
++;
        nSnd 
= nFst;
    }

    
if (nFst >= nSnd)
    
{
        
for (; nFst<nMax-1 && pFlags[nFst]; nFst++)
            ;
        nOper 
= 0;
        pFlags[nFst] 
= true;
        nSnd 
= nFst;
        
for (nNext = nFst+1; nNext<nMax && pFlags[nNext]; nNext++)
            ;
        assert (nNext 
!= nMax);
    }


    
if (nNext > nSnd)
    
{
        assert(
!pFlags[nNext]);
        
if (nSnd != nFst)
            pFlags[nSnd] 
= false;
        nSnd 
= nNext;
        pFlags[nSnd] 
= true;
        nOper 
= 0;
        
return;
    }

    nOper
++;
    
if (nOper==OPER_DIV1 && pNums[nSnd].Numberator()==0)
        nOper
++;
    
char nNextOper = nOper+1;
    
if (nNextOper>OPER_MUL)
    
{
        
if (nNextOper == OPER_DIV1 && pNums[nSnd].Numberator()==0)
            nNextOper
++;
        
if (nNextOper == OPER_DIV2 && pNums[nFst].Numberator()==0)
            nNextOper
++;
    }


    
if (nNextOper > OPER_DIV2)
    
{
        
for (nNext=nSnd+1; nNext<nMax && pFlags[nNext]; nNext++)
            ;
    }

}


CRational OperateRationals(
const CRational& fst, const CRational& snd, char nOper)
{
    
switch (nOper)
    
{
    
case OPER_ADD: return fst + snd; 
    
case OPER_SUB1: return fst - snd; 
    
case OPER_SUB2: return snd - fst; 
    
case OPER_MUL: return fst * snd; 

    
case OPER_DIV1: 
        assert (snd.Numberator() 
!= 0);
        
return fst/snd;

    
case OPER_DIV2: 
        assert (fst.Numberator() 
!= 0);
        
return snd/fst;
    }

    assert (
false);
    
return 0;
}


CGame24::CGame24(
int nRes, int* pNums, int nLen)
{
    assert(nLen 
> 0 && nLen < _nSIZE);
    m_nRes 
= nRes;
    
for (int i=0; i<nLen; i++)
        m_Nums[i] 
= pNums[i];
    memset(m_Flags, 
0sizeof(m_Flags));
    memset(m_Steps, 
0sizeof(m_Steps));
    m_nLen 
= static_cast<char>(nLen);
    m_nCur 
= 0;
}


bool CGame24::CalcNextResult()
{
    
while (m_nCur >= 0 && !m_Steps[m_nCur].HasNext(m_Flags, m_nLen+m_nCur))
        m_Steps[m_nCur
--].Discard(m_Flags);
    
if (m_nCur < 0)
        
return false;

    
while (m_nCur < m_nLen-1)
    
{
        m_Steps[m_nCur].ToNext(m_Flags, m_Nums, m_nLen
+m_nCur);
        
const Step& step = m_Steps[m_nCur];
        m_Nums[m_nLen
+m_nCur] = OperateRationals(m_Nums[step.nFst], m_Nums[step.nSnd], step.nOper);
        m_nCur
++;
    }

    m_nCur
--;

    
return true;
}


bool CGame24::Play()
{
    
while (CalcNextResult())
    
{
        
if (m_Nums[m_nLen+m_nCur] == m_nRes)
            
return true;
    }

    
return false;
}


size_t CGame24::Express(
char* pExp)
{
    size_t len 
= buildExpress(pExp, m_nCur, OPER_ADD); // 加法的運(yùn)算級別最低
    pExp[len] = 0;
    
return len;
}


bool NeedParentheses(char nSuperOper, char nSubOper)
{
    assert(nSuperOper 
<= OPER_DIV2);
    assert(nSubOper 
<= OPER_DIV2);
    
static const char g_ACTUAL_OPER[] = {OPER_ADD, OPER_SUB1, OPER_MUL, OPER_DIV1, OPER_SUB1, OPER_DIV1};
    nSuperOper 
= g_ACTUAL_OPER[nSuperOper];
    nSubOper 
= g_ACTUAL_OPER[nSubOper];
    
return (nSuperOper>nSubOper) || (nSuperOper==nSubOper && (nSubOper==OPER_SUB1 || nSuperOper==OPER_DIV1));
}


size_t CGame24::buildExpress(
char* pExp, char nStep, char nSuperOper)
{
    assert(nStep 
<= m_nCur);
    
char* sPos = pExp;
    
const Step& step = m_Steps[nStep];
    
char nFst = step.nFst;
    
char nSnd = step.nSnd;
    
char nOper = step.nOper;
    
if(step.nOper==OPER_SUB2 || step.nOper==OPER_DIV2)
        swap(nFst, nSnd);

    
bool bParentheses = NeedParentheses(nSuperOper, nOper);
    
if (bParentheses)
        
*sPos++ = '(';
    
if (nFst >= m_nLen)
        sPos 
+= buildExpress(sPos, nFst-m_nLen, nOper);
    
else
        sPos 
+= sprintf(sPos, ("%d"), m_Nums[nFst].Numberator());

    
*sPos++ = g_sOPER_SYMBOL[nOper];

    
if (nSnd >= m_nLen)
        sPos 
+= buildExpress(sPos, nSnd-m_nLen, nOper);
    
else
        sPos 
+= sprintf(sPos, ("%d"), m_Nums[nSnd].Numberator());

    
if (bParentheses)
        
*sPos++ = ')';
    
return sPos-pExp;
}


int main()
{
    
char sExpress[256= 0 };
    
int Nums[] = {12345};
    CGame24 game(
24, Nums, 5);
    
while (game.Play())
    
{
        game.Express(sExpress);
        cout 
<< sExpress << endl;
    }

    
return 0;
}

posted on 2012-06-07 16:20 華夏之火 閱讀(1883) 評論(1)  編輯 收藏 引用 所屬分類: 玩具代碼

評論

# re: 玩具代碼 24點(diǎn)游戲 2012-06-15 14:29 ss

可以運(yùn)行嗎  回復(fù)  更多評論   

導(dǎo)航

統(tǒng)計

常用鏈接

留言簿(6)

隨筆分類

隨筆檔案

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲高清影视| 久久久久国产精品一区二区| 欧美一区二区三区四区在线| 99国产精品视频免费观看| 亚洲人成在线免费观看| 91久久精品日日躁夜夜躁国产| 国产一级久久| 在线观看三级视频欧美| 亚洲国产另类久久久精品极度| 91久久夜色精品国产九色| 日韩亚洲欧美综合| 亚洲一区久久久| 久久爱另类一区二区小说| 久久蜜桃资源一区二区老牛| 欧美jjzz| 在线亚洲一区| 久久精品综合网| 欧美精品18| 国产欧美高清| 激情综合网址| 欧美大片一区二区| 久久九九精品| 快播亚洲色图| 欧美午夜精品久久久| 韩国av一区二区| 久久爱www久久做| 欧美 日韩 国产精品免费观看| 国产精品成人一区二区| 怡红院精品视频在线观看极品| 一道本一区二区| 久久久久综合网| 9i看片成人免费高清| 久久久精品tv| 国产精品久久久久三级| 亚洲日本中文字幕| 久久se精品一区精品二区| 亚洲免费av网站| 久久久久久久网站| 国产精品一区久久久| 日韩一级免费观看| 免费的成人av| 欧美一区二区精品久久911| 欧美日韩视频不卡| 亚洲激情视频在线观看| 久久黄金**| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 国产一区日韩欧美| 亚洲永久免费观看| 亚洲欧洲在线免费| 久久久久久网址| 国内外成人免费视频| 亚洲欧美视频一区二区三区| 日韩午夜视频在线观看| 欧美精品免费在线| 亚洲激情午夜| 欧美激情小视频| 久久久夜夜夜| 精久久久久久| 久久免费视频在线观看| 欧美一区影院| 国产一区二区按摩在线观看| 亚洲欧美中文日韩v在线观看| 亚洲美女精品成人在线视频| 欧美精品免费播放| 一区二区三区国产精华| 亚洲精品永久免费| 欧美日韩在线大尺度| 亚洲一区二区三区高清 | 欧美看片网站| 欧美成人三级在线| 亚洲人久久久| 91久久午夜| 欧美揉bbbbb揉bbbbb| 亚洲影视九九影院在线观看| 欧美不卡在线| 欧美日韩视频免费播放| 一区二区三区.www| 一个人看的www久久| 国产精品xxxxx| 亚洲欧美日韩另类精品一区二区三区| 亚洲精品一区二区网址| 欧美色偷偷大香| 亚洲欧美另类国产| 欧美专区中文字幕| 最近中文字幕日韩精品 | 国产日韩av高清| 久久综合色播五月| 欧美国产在线视频| 亚洲一区在线直播| 欧美综合第一页| 亚洲人妖在线| 亚洲午夜在线观看| 亚洲高清视频一区| 亚洲最新在线| 亚洲大胆在线| 国产精品99久久久久久宅男 | 国产在线观看一区| 亚洲国产成人精品久久久国产成人一区| 欧美精品九九99久久| 欧美一区二区在线免费播放| 美日韩丰满少妇在线观看| 亚洲欧美日韩精品久久亚洲区 | 国产精品成人aaaaa网站| 国产精品乱码一区二区三区| 久久精品视频在线| 欧美日本高清一区| 久久久久久亚洲精品中文字幕 | 欧美精品久久久久久久| 久久精品国产免费观看| 欧美日韩国产精品一卡| 久久久亚洲人| 国产精品久久久久久久一区探花| 裸体女人亚洲精品一区| 亚洲综合成人在线| 亚洲黑丝在线| 久久狠狠久久综合桃花| 亚洲欧美一区在线| 欧美猛交免费看| 免费观看一区| 国产一区视频网站| 亚洲综合大片69999| 在线亚洲自拍| 欧美成人免费在线| 欧美成人首页| 在线国产日韩| 久久久久久黄| 久久资源在线| 国内精品国产成人| 欧美一区二区三区在线视频 | 亚洲综合成人在线| 一区二区三区久久精品| 欧美激情亚洲自拍| 亚洲国产精品va在线观看黑人| 狠狠色丁香婷婷综合久久片| 午夜精品久久久久久久蜜桃app | 欧美日韩成人| 欧美激情中文字幕在线| 亚洲高清视频在线| 免费观看久久久4p| 女生裸体视频一区二区三区| 伊人久久综合97精品| 久久久久久久尹人综合网亚洲| 久久久久久久久综合| 黄色成人91| 久久久久久成人| 欧美激情精品久久久久| 亚洲日本免费| 欧美区二区三区| 亚洲视频1区2区| 欧美在线看片a免费观看| 日韩一级免费观看| 亚洲欧美日韩国产成人| 国产婷婷一区二区| 久久免费视频在线观看| 亚洲国产日韩精品| 亚洲视频一区在线| 国产人成精品一区二区三| 久久嫩草精品久久久精品| 亚洲高清电影| 亚洲网站在线观看| 国产欧美一区二区三区另类精品 | 欧美精品免费播放| 一区二区三区四区国产| 久久久久久9| 亚洲破处大片| 国产伦精品免费视频 | 久久综合九色综合欧美就去吻 | 韩国免费一区| 免费成人激情视频| 亚洲视频视频在线| 久久综合狠狠综合久久激情| 亚洲欧洲综合另类在线| 在线视频一区观看| 久久久久久欧美| 亚洲精品乱码久久久久久按摩观 | 亚洲国产美女| 欧美日韩一区二区三| 久久av资源网| 亚洲精品中文字| 久久久久久久久久久一区| 亚洲美女免费精品视频在线观看| 国产精品久久久爽爽爽麻豆色哟哟| 久久精品二区三区| 99在线视频精品| 久久综合伊人77777麻豆| 亚洲午夜久久久久久久久电影院| 精品av久久707| 欧美午夜不卡影院在线观看完整版免费 | 欧美日韩精品系列| 欧美一区二区三区免费看 | 欧美成人dvd在线视频| 狠狠色丁香婷婷综合| 欧美精品久久久久久| 午夜一区二区三区在线观看| 欧美激情第4页| 久久久夜夜夜| 午夜亚洲伦理| 一区二区高清在线观看| 亚洲国产欧美一区二区三区同亚洲| 国产精品麻豆va在线播放|