日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

扫雷游戏算法

發布時間:2024/1/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 扫雷游戏算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

提供一個面向過程C/C++代碼,很容易用類封裝,改成面向對象版本的。

#include <iostream>#include <random>void makeArray(char** &pArray, int row, int col); void printArray(char** pArray, int row,int col); void layMines(char** pArray, int row, int col, int num); void mineHunting(char** pArray, int row, int col, int posX, int posY); void allMineHunting(char** pArray, int row, int col);int main() {char** pArray = nullptr;int row = 9, col = 9, num=10;makeArray(pArray,row,col);layMines(pArray,row,col,num);allMineHunting(pArray,row,col);printArray(pArray,row,col);return 0; }void makeArray(char** &pArray, const int row, const int col){pArray = new char*[row];for(int i=0;i<col;i++){pArray[i] = new char[col];}for(int i=0;i<row;i++){for(int j=0;j<col;j++){pArray[i][j] = '0';}} }void printArray(char** pArray,int row,int col){for(int i=0;i<row;i++){for(int j=0;j<col;j++){std::cout<<pArray[i][j]<<" ";}std::cout<<std::endl;} }void layMines(char** pArray,int row,int col, int num){std::random_device generator;std::uniform_int_distribution<int> distribution(0,row*col);int count =0;while(count<num){int dice_roll = distribution(generator);int i = dice_roll/row;int j = dice_roll%col;if(pArray[i][j]!='9'){pArray[i][j]='9';count++;}}}void mineHunting(char** pArray, int row, int col, int posX, int posY){if(pArray[posX][posY]!='0') return;int count = 0;const int direction[][2] = {{1,1},{1,0},{1,-1},{0,1},{0,-1},{-1,1},{-1,0},{-1,-1}};for(auto i : direction){int nX = posX + i[0];int nY = posY + i[1];if(nX>=0&&nX<row&&nY>=0&&nY<col&&pArray[nX][nY]=='9') count++;}pArray[posX][posY] = char('0' + count);}void allMineHunting(char** pArray, int row, int col){for(int i=0;i<row;i++){for(int j=0;j<col;j++){mineHunting(pArray,row,col,i,j);}} }

注意,上面并不是真正的掃雷游戲算法,只是一次性將雷全部探出。真正的掃雷算法是這樣的。是有一個DFS的過程在里面的。見Leetcode 529

const int direction[][2] = {{1,1},{1,0},{1,-1},{0,1},{0,-1},{-1,1},{-1,0},{-1,-1}}; class Solution { public:void dfs(vector<vector<char>>& board, int x, int y){if(board[x][y]!='E') return;int row = board.size(), col = board[0].size();int count = 0;for(auto i:direction){int nx = x + i[0];int ny = y + i[1];if(nx>=0&&nx<row&&ny>=0&&ny<col&&board[nx][ny]=='M') count++;}if(count>0){board[x][y] = '0' + count;return;}board[x][y] = 'B';for(auto i:direction){int nx = x + i[0];int ny = y + i[1];if(nx>=0&&nx<row&&ny>=0&&ny<col){dfs(board,nx,ny);}}}vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {int x = click[0], y = click[1];int row = board.size(), col = board[0].size();if(board[x][y]=='M'){board[x][y] = 'X';return board;}dfs(board,click[0],click[1]);return board;} };

?

總結

以上是生活随笔為你收集整理的扫雷游戏算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。