精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊聊用 JavaScript 做數獨

開發 前端
最近看到老婆天天在手機上玩數獨,突然想起 N 年前刷 LeetCode 的時候,有個類似的算法題(37.解數獨),是不是可以把這個算法進行可視化。

[[421904]]

最近看到老婆天天在手機上玩數獨,突然想起 N 年前刷 LeetCode 的時候,有個類似的算法題(37.解數獨),是不是可以把這個算法進行可視化。

說干就干,經過一個小時的實踐,最終效果如下:

怎么解數獨

解數獨之前,我們先了解一下數獨的規則:

數字 1-9 在每一行只能出現一次。

數字 1-9 在每一列只能出現一次。

數字 1-9 在每一個以粗實線分隔的九宮格( 3x3 )內只能出現一次。

接下來,我們要做的就是在每個格子里面填一個數字,然后判斷這個數字是否違反規定。

填第一個格子

首先,在第一個格子填 1,發現在第一列里面已經存在一個 1,此時就需要擦掉前面填的數字 1,然后在格子里填上 2,發現數字在行、列、九宮格內均無重復。那么這個格子就填成功了。

填第二個格子

下面看第二個格子,和前面一樣,先試試填 1,發現在行、列、九宮格內的數字均無重復,那這個格子也填成功了。

填第三個格子

下面看看第三個格子,由于前面兩個格子,我們已經填過數字 1、2,所以,我們直接從數字 3 開始填。填 3 后,發現在第一行里面已經存在一個 3,然后在格子里填上 4,發現數字 4 在行和九宮格內均出現重復,依舊不成功,然后嘗試填上數字 5,終于沒有了重復數字,表示填充成功。

……

一直填……

填第九個格子

照這個思路,一直填到第九個格子,這個時候,會發現,最后一個數字 9 在九宮格內沖突了。而 9 已經是最后一個數字了,這里沒辦法填其他數字了,只能返回上一個格子,把第七個格子的數字從 8 換到 9,發現在九宮格內依然沖突。

此時需要替換上上個格子的數字(第六個格子)。直到沒有沖突為止,所以在這個過程中,不僅要往后填數字,還要回過頭看看前面的數字有沒有問題,不停地嘗試。

綜上所述

解數獨就是一個不斷嘗試的過程,每個格子把數字 1-9 都嘗試一遍,如果出現沖突就擦掉這個數字,直到所有的格子都填完。

通過代碼來實現

把上面的解法反映到代碼上,就需要通過 遞歸 + 回溯 的思路來實現。

在寫代碼之前,先看看怎么把數獨表示出來,這里參考 leetcode 上的題目:37. 解數獨。

前面的這個題目,可以使用一個二維數組來表示。最外層數組內一共有 9 個數組,表示數獨的 9 行,內部的每個數組內 9 字符分別對應數組的列,未填充的空格通過字符('.' )來表示。

  1. const sudoku = [ 
  2.   ['.''.''.''4''.''.''.''3''.'], 
  3.   ['7''.''4''8''.''.''1''.''2'], 
  4.   ['.''.''.''2''3''.''4''.''9'], 
  5.   ['.''4''.''5''.''9''.''8''.'], 
  6.   ['5''.''.''.''.''.''9''1''3'], 
  7.   ['1''.''.''.''8''.''2''.''4'], 
  8.   ['.''.''.''.''.''.''3''4''5'], 
  9.   ['.''5''1''9''4''.''7''2''.'], 
  10.   ['4''7''3''.''5''.''.''9''1'], 

知道如何表示數組后,我們再來寫代碼。

  1. const sudoku = [……] 
  2. // 方法接受行、列兩個參數,用于定位數獨的格子 
  3. function solve(row, col) { 
  4.   if (col >= 9) {  
  5.    // 超過第九列,表示這一行已經結束了,需要另起一行 
  6.     col = 0 
  7.     row += 1 
  8.     if (row >= 9) { 
  9.       // 另起一行后,超過第九行,則整個數獨已經做完 
  10.       return true 
  11.     } 
  12.   } 
  13.   if (sudoku[row][col] !== '.') { 
  14.     // 如果該格子已經填過了,填后面的格子 
  15.     return solve(row, col + 1) 
  16.   } 
  17.   // 嘗試在該格子中填入數字 1-9 
  18.   for (let num = 1; num <= 9; num++) { 
  19.     if (!isValid(row, col, num)) { 
  20.       // 如果是無效數字,跳過該數字 
  21.       continue 
  22.     } 
  23.     // 填入數字 
  24.     sudoku[row][col] = num.toString() 
  25.     // 繼續填后面的格子 
  26.     if (solve(row, col + 1)) { 
  27.       // 如果一直到最后都沒問題,則這個格子的數字沒問題 
  28.       return true 
  29.     } 
  30.     // 如果出現了問題,solve 返回了 false 
  31.     // 說明這個地方要重填 
  32.     sudoku[row][col] = '.' // 擦除數字 
  33.   } 
  34.   // 數字 1-9 都填失敗了,說明前面的數字有問題 
  35.   // 返回 FALSE,進行回溯,前面數字要進行重填 
  36.   return false 

上面的代碼只是實現了遞歸、回溯的部分,還有一個 isValid 方法沒有實現。該方法主要就是按照數獨的規則進行一次校驗。

  1. const sudoku = [……] 
  2. function isValid(row, col, num) { 
  3.   // 判斷行里是否重復 
  4.   for (let i = 0; i < 9; i++) { 
  5.     if (sudoku[row][i] === num) { 
  6.       return false 
  7.     } 
  8.   } 
  9.   // 判斷列里是否重復 
  10.   for (let i = 0; i < 9; i++) { 
  11.     if (sudoku[i][col] === num) { 
  12.       return false 
  13.     } 
  14.   } 
  15.   // 判斷九宮格里是否重復 
  16.   const startRow = parseInt(row / 3) * 3 
  17.   const startCol = parseInt(col / 3) * 3 
  18.   for (let i = startRow; i < startRow + 3; i++) { 
  19.     for (let j = startCol; j < startCol + 3; j++) { 
  20.       if (sudoku[i][j] === num) { 
  21.         return false 
  22.       } 
  23.     } 
  24.   } 
  25.   return true 

通過上面的代碼,我們就能解出一個數獨了。

  1. const sudoku = [ 
  2.   ['.''.''.''4''.''.''.''3''.'], 
  3.   ['7''.''4''8''.''.''1''.''2'], 
  4.   ['.''.''.''2''3''.''4''.''9'], 
  5.   ['.''4''.''5''.''9''.''8''.'], 
  6.   ['5''.''.''.''.''.''9''1''3'], 
  7.   ['1''.''.''.''8''.''2''.''4'], 
  8.   ['.''.''.''.''.''.''3''4''5'], 
  9.   ['.''5''1''9''4''.''7''2''.'], 
  10.   ['4''7''3''.''5''.''.''9''1'
  11. function isValid(row, col, num) {……} 
  12. function solve(row, col) {……} 
  13. solve(0, 0) // 從第一個格子開始解 
  14. console.log(sudoku) // 輸出結果 

輸出結果

動態展示做題過程

有了上面的理論知識,我們就可以把這個做題的過程套到 react 中,動態的展示做題的過程,也就是文章最開始的 Gif 中的那個樣子。

這里直接使用 create-react-app 腳手架快速啟動一個項目

  1. npx create-react-app sudoku 
  2. cd sudoku 

打開 App.jsx ,開始寫代碼。

  1. import React from 'react'
  2. import './App.css'
  3.  
  4. class App extends React.Component { 
  5.   state = { 
  6.     // 在 state 中配置一個數獨二維數組 
  7.     sudoku: [ 
  8.       ['.''.''.''4''.''.''.''3''.'], 
  9.       ['7''.''4''8''.''.''1''.''2'], 
  10.       ['.''.''.''2''3''.''4''.''9'], 
  11.       ['.''4''.''5''.''9''.''8''.'], 
  12.       ['5''.''.''.''.''.''9''1''3'], 
  13.       ['1''.''.''.''8''.''2''.''4'], 
  14.       ['.''.''.''.''.''.''3''4''5'], 
  15.       ['.''5''1''9''4''.''7''2''.'], 
  16.       ['4''7''3''.''5''.''.''9''1'
  17.     ] 
  18.   } 
  19.  
  20.  // TODO:解數獨 
  21.   solveSudoku = async () => { 
  22.     const { sudoku } = this.state 
  23.   } 
  24.  
  25.   render() { 
  26.     const { sudoku } = this.state 
  27.     return ( 
  28.       <div className="container"
  29.         <div className="wrapper"
  30.           {/* 遍歷二維數組,生成九宮格 */} 
  31.           {sudoku.map((list, row) => ( 
  32.             {/* div.row 對應數獨的行 */} 
  33.             <div className="row" key={`row-${row}`}> 
  34.               {list.map((item, col) => ( 
  35.               {/* span 對應數獨的每個格子 */} 
  36.                 <span key={`box-${col}`}>{ item !== '.' && item }</span> 
  37.               ))} 
  38.             </div> 
  39.           ))} 
  40.           <button onClick={this.solveSudoku}>開始做題</button> 
  41.         </div> 
  42.       </div> 
  43.     ); 
  44.   } 

九宮格樣式

給每個格子加上一個虛線的邊框,先讓它有一點九宮格的樣子。

  1. .row { 
  2.   display: flex; 
  3.   direction: row; 
  4.   /* 行內元素居中 */ 
  5.   justify-content: center; 
  6.   align-content: center; 
  7. .row span { 
  8.   /* 每個格子寬高一致 */ 
  9.   width: 30px; 
  10.   min-height: 30px; 
  11.   line-height: 30px; 
  12.   text-align: center; 
  13.   /* 設置虛線邊框 */ 
  14.   border: 1px dashed #999; 

可以得到一個這樣的圖形:

接下來,需要給外邊框和每個九宮格加上實線的邊框,具體代碼如下:

  1. /* 第 1 行頂部加上實現邊框 */ 
  2. .row:nth-child(1) span { 
  3.   border-top: 3px solid #333; 
  4. /* 第 3、6、9 行底部加上實現邊框 */ 
  5. .row:nth-child(3n) span { 
  6.   border-bottom: 3px solid #333; 
  7. /* 第 1 列左邊加上實現邊框 */ 
  8. .row span:first-child { 
  9.   border-left: 3px solid #333; 
  10.  
  11. /* 第 3、6、9 列右邊加上實現邊框 */ 
  12. .row span:nth-child(3n) { 
  13.   border-right: 3px solid #333; 

這里會發現第三、六列的右邊邊框和第四、七列的左邊邊框會有點重疊,第三、六行的底部邊框和第四、七行的頂部邊框也會有這個問題,所以,我們還需要將第四、七列的左邊邊框和第三、六行的底部邊框進行隱藏。

  1. .row:nth-child(3n + 1) span { 
  2.   border-top: none; 
  3. .row span:nth-child(3n + 1) { 
  4.   border-left: none; 

做題邏輯

樣式寫好后,就可以繼續完善做題的邏輯了。

  1. class App extends React.Component { 
  2.   state = { 
  3.     // 在 state 中配置一個數獨二維數組 
  4.     sudoku: [……] 
  5.   } 
  6.  
  7.   solveSudoku = async () => { 
  8.     const { sudoku } = this.state 
  9.     // 判斷填入的數字是否有效,參考上面的代碼,這里不再重復 
  10.     const isValid = (row, col, num) => { 
  11.       …… 
  12.     } 
  13.     // 遞歸+回溯的方式進行解題 
  14.    const solve = async (row, col) => { 
  15.       if (col >= 9) {  
  16.         col = 0 
  17.         row += 1 
  18.         if (row >= 9) return true 
  19.       } 
  20.       if (sudoku[row][col] !== '.') { 
  21.         return solve(row, col + 1) 
  22.       } 
  23.       for (let num = 1; num <= 9; num++) { 
  24.         if (!isValid(row, col, num)) { 
  25.           continue 
  26.         } 
  27.   
  28.         sudoku[row][col] = num.toString() 
  29.         this.setState({ sudoku }) // 填了格子之后,需要同步到 state 
  30.  
  31.         if (solve(row, col + 1)) { 
  32.           return true 
  33.         } 
  34.  
  35.         sudoku[row][col] = '.' 
  36.         this.setState({ sudoku }) // 填了格子之后,需要同步到 state 
  37.       } 
  38.       return false 
  39.     } 
  40.     // 進行解題 
  41.     solve(0, 0) 
  42.   } 
  43.  
  44.   render() { 
  45.     const { sudoku } = this.state 
  46.     return (……) 
  47.   } 

對比之前的邏輯,這里只是在對數獨的二維數組填空后,調用了 this.setState 將 sudoku 同步到了 state 中。

  1. function solve(row, col) { 
  2.    …… 
  3.    sudoku[row][col] = num.toString() 
  4. +  this.setState({ sudoku }) 
  5.   …… 
  6.    sudoku[row][col] = '.' 
  7. +  this.setState({ sudoku }) // 填了格子之后,需要同步到 state 

在調用 solveSudoku 后,發現并沒有出現動態的效果,而是直接一步到位的將結果同步到了視圖中。

這是因為 setState 是一個偽異步調用,在一個事件任務中,所以的 setState 都會被合并成一次,需要看到動態的做題過程,我們需要將每一次 setState 操作放到該事件流之外,也就是放到 setTimeout 中。更多關于 setState 異步的問題,可以參考我之前的文章:React 中 setState 是一個宏任務還是微任務?

  1. solveSudoku = async () => { 
  2.   const { sudoku } = this.state 
  3.   // 判斷填入的數字是否有效,參考上面的代碼,這里不再重復 
  4.   const isValid = (row, col, num) => { 
  5.     …… 
  6.   } 
  7.   // 脫離事件流,調用 setState 
  8.   const setSudoku = async (row, col, value) => { 
  9.     sudoku[row][col] = value 
  10.     return new Promise(resolve => { 
  11.       setTimeout(() => { 
  12.         this.setState({ 
  13.           sudoku 
  14.         }, () => resolve()) 
  15.       }) 
  16.     }) 
  17.   } 
  18.   // 遞歸+回溯的方式進行解題 
  19.   const solve = async (row, col) => { 
  20.     …… 
  21.     for (let num = 1; num <= 9; num++) { 
  22.       if (!isValid(row, col, num)) { 
  23.         continue 
  24.       } 
  25.  
  26.    await setSudoku(row, col, num.toString()) 
  27.  
  28.       if (await solve(row, col + 1)) { 
  29.         return true 
  30.       } 
  31.  
  32.    await setSudoku(row, col, '.'
  33.     } 
  34.     return false 
  35.   } 
  36.   // 進行解題 
  37.   solve(0, 0) 

最后效果如下:

本文轉載自微信公眾號「自然醒的筆記本」,可以通過以下二維碼關注。轉載本文請聯系自然醒的筆記本公眾號。

 

責任編輯:武曉燕 來源: 自然醒的筆記本
相關推薦

2023-11-06 11:33:15

C++數獨

2022-02-09 11:02:16

JavaScript前端框架

2021-01-07 07:53:10

JavaScript內存管理

2021-10-17 22:40:51

JavaScript開發 框架

2021-01-31 23:54:23

數倉模型

2022-07-29 14:47:34

數獨Sudoku鴻蒙

2013-06-20 10:52:37

算法實踐數獨算法數獨源碼

2021-06-02 09:01:19

JavaScript 前端異步編程

2019-07-23 15:04:54

JavaScript調用棧事件循環

2023-11-20 08:01:38

并發處理數Tomcat

2013-06-17 12:44:38

WP7開發Windows Pho數獨游戲

2022-10-19 15:19:53

數獨Sudoku鴻蒙

2022-10-18 15:45:17

數獨Sudoku鴻蒙

2022-10-19 15:27:36

數獨Sudoku鴻蒙

2022-02-23 09:03:29

JavaScript開發命名約定

2021-09-08 08:55:45

Javascript 高階函數前端

2022-02-23 08:18:06

nginx前端location

2022-03-01 17:16:16

數倉建模ID Mapping

2020-06-15 08:13:42

Linux服務端并發數

2020-09-24 16:40:20

人工智能量子計算技術
點贊
收藏

51CTO技術棧公眾號

亚洲成人综合在线| 国产毛片精品国产一区二区三区| 亚洲欧美在线免费| 99sesese| 丁香花在线高清完整版视频| 久久午夜免费电影| 91在线观看免费观看| 男人的天堂一区| 日韩欧美大片| 亚洲激情久久久| 15—17女人毛片| 国产白丝在线观看| 国产精品女上位| 国产亚洲福利社区| 夜夜躁很很躁日日躁麻豆| 极品尤物久久久av免费看| 亚洲视频日韩精品| 亚洲欧美日韩偷拍| 日韩五码电影| 色综合中文字幕国产| 日本成人在线不卡| 亚洲视频tv| 久久久久青草大香线综合精品| 成人亚洲激情网| 日本一区二区免费电影| 国产精品magnet| 丝袜亚洲欧美日韩综合| 手机av免费看| 91麻豆精品激情在线观看最新 | 蜜桃成人精品| 亚洲v日本v欧美v久久精品| 亚洲一区二区在线看| 免费福利在线视频| 成人丝袜18视频在线观看| 国产在线精品播放| 中文精品久久久久人妻不卡| 一区二区三区四区五区精品视频 | 毛片av中文字幕一区二区| 午夜精品视频在线| 国产一级中文字幕| 欧美三级视频| 久久成人精品一区二区三区| 国产日韩在线观看av| 日本一区二区三区四区五区六区| 黄色电影免费在线看| 99re6这里只有精品视频在线观看| av噜噜色噜噜久久| 精品人妻无码一区二区三区蜜桃一| 麻豆精品在线观看| 国产精品中文字幕在线| 樱花视频在线免费观看| 久久国产直播| 国产精品成人在线| 在线观看免费观看在线| 免费不卡在线视频| 国产美女精彩久久| 国产精品久久久久久久免费看| 视频一区中文字幕国产| 国产精品精品视频| 亚洲网站在线免费观看| 蜜桃视频在线一区| 91免费在线视频网站| 97人妻一区二区精品免费视频| 久久精品国产99| 成人做爽爽免费视频| www.爱爱.com| 99久久精品国产导航| 免费国产一区| 1024免费在线视频| 亚洲欧美另类小说| 免费看毛片的网址| 中文字幕在线直播| 在线观看成人免费视频| 激情黄色小视频| 欧美视频二区欧美影视| 亚洲国产精品久久精品怡红院| 亚洲永久无码7777kkk| 国产传媒欧美日韩成人精品大片| 在线午夜精品自拍| 成年人一级黄色片| 亚洲人体偷拍| 国产精品久久久久久久电影| 亚洲天堂网在线观看视频| 国产精品正在播放| 久久综合久久久| 日本视频不卡| 香蕉影视欧美成人| 冲田杏梨av在线| 精品国产鲁一鲁****| 亚洲精美色品网站| 天美传媒免费在线观看| 国产精品videosex极品| 69av在线播放| 在线观看黄色网| 国产91富婆露脸刺激对白| 久久综合狠狠综合久久综青草| 成人不用播放器| 洋洋成人永久网站入口| 日韩手机在线观看视频| 国产午夜精品一区在线观看| 欧美一区二区在线观看| 免费无码一区二区三区| 99re66热这里只有精品8| 高清欧美性猛交xxxx| 亚洲天堂网视频| 99精品视频在线免费观看| 一区二区三区四区视频在线观看| 啦啦啦中文在线观看日本| 视频小说一区二区| 欧美大胆一级视频| 娇妻被老王脔到高潮失禁视频| 国模一区二区三区| 国产精品亚洲自拍| 欧美女优在线观看| 亚洲精品成人精品456| 久草综合在线观看| 欧美日韩一本| 欧美精品成人91久久久久久久| 国产精品xxxxxx| 99re视频精品| 日韩av在线播放不卡| www.成人在线.com| 中文字幕不卡在线视频极品| 啦啦啦免费高清视频在线观看| 激情小说亚洲一区| 亚洲精品乱码久久久久久蜜桃91| 96av在线| 亚洲第一精品夜夜躁人人躁| 91香蕉一区二区三区在线观看| 久久精品免费| 久久综合一区| 美女高潮视频在线看| 精品区一区二区| 神马午夜精品91| 精品一区二区av| 亚洲一区二区三区在线观看视频| 成人黄色免费短视频| 日韩av在线播放资源| 国产精品美女毛片真酒店| 国产精品资源网站| 久久久久久久久网| 视频成人永久免费视频| 久久艳片www.17c.com | 国产偷倩在线播放| 欧美成人一区二区三区在线观看| 懂色av蜜臀av粉嫩av永久| 日韩电影在线一区二区| 欧美一进一出视频| gogo亚洲高清大胆美女人体| 亚洲欧美www| 亚洲AV无码成人精品区东京热| 久久女同互慰一区二区三区| 日本wwww视频| 国产精品羞羞答答在线观看| 国产va免费精品高清在线观看 | 欧美黄色一级| 欧美日韩福利在线观看| 亚洲男人天堂久久| 性久久久久久久久久久久| 中文字幕在线视频播放| 国产欧美日韩亚洲一区二区三区| 好吊色欧美一区二区三区视频| 日韩电影毛片| 亚洲小视频在线观看| 97人妻精品视频一区| 亚洲特级片在线| 中文字幕 欧美 日韩| 中文精品在线| 日本一区二区精品视频| www.久久草.com| 国语自产精品视频在线看一大j8| 天天色综合av| 欧洲精品中文字幕| 国产女人被狂躁到高潮小说| 成人午夜av在线| 亚洲成熟丰满熟妇高潮xxxxx| 精品免费在线| 91免费精品视频| 欧美aa一级| 夜久久久久久| 俺去了亚洲欧美日韩| 亚洲av综合色区无码一区爱av| 天天av天天翘天天综合网色鬼国产| 亚洲 小说 欧美 激情 另类| 麻豆国产欧美一区二区三区| 国产成人一区二区三区别| 日韩精品丝袜美腿| 成人精品在线视频| 国产ktv在线视频| 色偷偷偷亚洲综合网另类| 精品人妻久久久久一区二区三区| 欧美日韩国产在线| 加勒比婷婷色综合久久| 久久综合色综合88| 奇米777在线视频| 美女精品一区| 国产爆乳无码一区二区麻豆| 国产不卡一二三区| julia一区二区中文久久94| 电影亚洲精品噜噜在线观看| 久色乳综合思思在线视频| 四虎影视精品成人| 日韩西西人体444www| 日韩精品一区不卡| 亚洲五码中文字幕| 日本裸体美女视频| 久久免费美女视频| 在线观看一区二区三区四区| 蜜臀av性久久久久av蜜臀妖精| 国产96在线 | 亚洲| 日韩理论在线| 日本不卡一二三区| 国产精品乱战久久久| 亚洲精品日韩av| 日本一区免费网站| 欧美亚洲激情视频| 丁香花视频在线观看| 日韩中文在线中文网在线观看| 四虎精品成人免费网站| 欧美www视频| 国产一区二区波多野结衣| 日本韩国一区二区三区| 自拍偷拍欧美亚洲| 亚洲一区二区精品视频| 手机在线免费看毛片| 中文一区二区完整视频在线观看| 日韩 中文字幕| 波多野结衣亚洲一区| 久久精品无码一区二区三区毛片| 免费人成网站在线观看欧美高清| 波多野结衣家庭教师视频| 在线 亚洲欧美在线综合一区| 免费成人深夜夜行网站视频| 97久久视频| 性欧美videosex高清少妇| 久草成人资源| 欧美理论一区二区| 免费一区二区三区视频导航| 精品一区久久久久久| 国产欧美三级电影| 狠狠干一区二区| 欧美a大片欧美片| 久草热久草热线频97精品| 美女呻吟一区| 久久99蜜桃综合影院免费观看| 豆花视频一区二区| 激情视频一区二区| 亚洲成a人片77777在线播放| 精品免费一区二区三区蜜桃| 青青一区二区| 欧美区高清在线| 日本不卡二三区| 椎名由奈jux491在线播放| 久久精品国内一区二区三区水蜜桃| 亚洲一区不卡在线| 在线观看国产精品入口| 国产一级大片免费看| 99视频在线精品国自产拍免费观看| 成年人看的毛片| 性欧美videos另类喷潮| 日韩在线第三页| 久久99精品国产麻豆婷婷| 免费在线观看污网站| 国产成人精品1024| 精品中文字幕在线播放| 久久久久久久免费视频了| 欧美午夜激情影院| 亚洲男人都懂的| 日韩精品久久久久久久| 欧美性猛交xxxx黑人猛交| 欧美特级黄色片| 91精品国产一区二区三区| 亚洲第一精品网站| 亚洲男人av在线| 色欧美激情视频在线| 久久久久女教师免费一区| 亚洲欧美se| 91九色国产视频| 神马久久影院| 伊人av成人| 亚洲一区激情| 57pao国产成永久免费视频| 国产黄色精品视频| 亚洲人成人无码网www国产 | 亚洲国产精品小视频| 国产综合在线观看| 欧美成人午夜激情在线| 热色播在线视频| 国产又爽又黄的激情精品视频| 欧美精品三级在线| 日韩免费三级| 黄色成人在线网址| 九九热在线免费| 成人av在线资源网站| 国产精品综合激情| 丝袜美腿美女被狂躁在线观看| 一区二区三区视频免费| av毛片在线播放| 国产精品wwwwww| 凹凸成人在线| 亚洲在线欧美| 国产精品久久久亚洲一区| 欧美激情国内自拍| 久久久久久久久久久99999| 妺妺窝人体色www聚色窝仙踪| 色香蕉成人二区免费| 亚洲乱色熟女一区二区三区| 亚洲香蕉av在线一区二区三区| 欧美xxxxhdvideosex| 国产日韩欧美日韩| 日韩有码中文字幕在线| 欧洲精品视频在线| 免费成人小视频| 五级黄高潮片90分钟视频| 一区二区免费在线播放| 这里只有精品免费视频| 亚洲成人免费网站| av免费在线免费观看| 国产精品日韩在线播放| 天天躁日日躁狠狠躁欧美| 日本免费成人网| 精品一区二区综合| jizz18女人高潮| 色一区在线观看| 日色在线视频| 97久久国产精品| 成人动漫视频| 97中文字幕在线| 国产激情一区二区三区四区| 蜜桃av.com| 欧美视频一区二| yourporn在线观看视频| 日本中文字幕久久看| 老司机成人在线| 亚洲熟妇无码另类久久久| 国产91富婆露脸刺激对白| 精国产品一区二区三区a片| 欧美一区二区三区系列电影| 午夜老司机在线观看| 国产精品视频男人的天堂| 欧美艳星介绍134位艳星| 日韩免费高清在线| 欧美国产一区视频在线观看| 中文字幕在线日本| 在线观看久久av| 成人涩涩视频| 亚洲成人自拍| 久88久久88久久久| 亚洲欧美小视频| 精品国产乱码久久久久久久久 | 免费国产精品视频| 午夜精品久久久久久久久久久久 | eeuss国产一区二区三区| 日本特黄特色aaa大片免费| 亚洲国产高潮在线观看| 男女羞羞在线观看| 日韩免费av一区二区三区| 老鸭窝一区二区久久精品| 99热这里只有精品4| 欧美一区二区三区影视| 欧美aaaaaaa| 精品综合久久| 日韩二区三区在线观看| 91av手机在线| 日韩精品中文字幕一区二区三区| 国产极品人妖在线观看| 精品久久久久久中文字幕动漫| 性娇小13――14欧美| 四季av中文字幕| 91精品婷婷国产综合久久| 欧美午夜大胆人体| 九九九九精品| 日本va欧美va瓶| 波多野结衣亚洲一区二区| 亚洲第一二三四五区| 精品网站在线| 天天想你在线观看完整版电影免费| 不卡的看片网站| 中文字幕日本视频| 欧美国产一区二区三区| 久久久久观看| 色戒在线免费观看| 一二三四社区欧美黄| 青青草免费在线| 91精品视频免费看| 亚洲专区一区| 中文字幕av播放| 亚洲免费视频观看| 一区二区三区日本视频| 3d动漫一区二区三区| 国产精品青草久久| 少妇高潮久久久| 成人疯狂猛交xxx| 亚洲综合国产激情另类一区| 成人无码精品1区2区3区免费看 | 国产精品久久久久久免费观看| 美女爽到呻吟久久久久| 特级片在线观看| 中文字幕一区日韩电影| 看全色黄大色大片免费久久久|