最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實(shí)現(xiàn)單詞小游戲

 更新時(shí)間:2021年02月25日 08:43:41   作者:mangoBUPT  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)單詞小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java實(shí)現(xiàn)單詞小游戲的具體代碼,供大家參考,具體內(nèi)容如下

介紹

公司最近有一個(gè)競(jìng)技場(chǎng)項(xiàng)目,里面有一個(gè)單詞小游戲。

游戲大概就是隨機(jī)生成一個(gè)5*5的棋盤(pán),上面有單詞的字母,通過(guò)滑動(dòng)連出正確的單詞。

棋盤(pán)生成算法

思路

首先隨機(jī)選個(gè)一個(gè)起點(diǎn),從這個(gè)點(diǎn)開(kāi)始鋪單詞。

分別選取上下左右四個(gè)方向作為下一個(gè)字母的擺放位置,不能觸邊也不能走重復(fù)路,直到平鋪完所有的單詞。

如果在棋盤(pán)能平鋪下單詞的情況下,找不到路徑,就從四個(gè)角作為起點(diǎn),必能找到路徑。

代碼

import java.util.*;

/**
 * @author Wang Guolong
 * @version 1.0
 * @date 2020/7/31 5:50 下午
 */
public class GenerateWordBoard {

 private static char[][] board;

 public static void main(String[] args) {
 GenerateWordBoard g = new GenerateWordBoard();
 g.generateCharBoard("vocabulary", 5, 5);
 }

 private void generateCharBoard(String word, int m, int n) {
 // 單詞為空 直接返回
 if (word.isEmpty()) {
  return;
 }
 // 單詞長(zhǎng)度大于棋盤(pán) 鋪不下 直接返回
 if (word.length() > m * n) {
  return;
 }
 // 初始化棋盤(pán) 全為*
 initBoard(m, n);

 char[] wordChar = word.toCharArray();
 // 隨機(jī)選取一個(gè)位置開(kāi)始
 Random random = new Random();
 int randomX = random.nextInt(m);
 int randomY = random.nextInt(n);
 // 開(kāi)始從隨機(jī)位置dfs鋪單詞 從index 0 開(kāi)始
 boolean result = generateDfs(board, wordChar, randomX, randomY, 0);
 // 如果沒(méi)有找到路線(xiàn) 那么從四個(gè)角開(kāi)始 必能找到一條路
 if (!result) {
  List<int[]> starts = Arrays.asList(new int[]{0, 0}, new int[]{0, n - 1}, new int[]{m - 1, 0},
   new int[]{m - 1, n - 1});
  // 隨機(jī)四個(gè)角的一個(gè)
  Collections.shuffle(starts);
  // 初始化棋盤(pán)
  initBoard(m, n);
  // dfs鋪單詞
  generateDfs(board, wordChar, starts.get(0)[0], starts.get(0)[1], 0);
 }
 // 查看結(jié)果
 for (int i = 0; i < board.length; i++) {
  for (int j = 0; j < board[0].length; j++) {
  System.out.print(board[i][j] + " ");
  }
  System.out.println();
 }
 }

 private void initBoard(int m, int n) {
 // 初始化
 board = new char[m][n];
 for (int i = 0; i < board.length; i++) {
  for (int j = 0; j < board[0].length; j++) {
  board[i][j] = '*';
  }
 }
 }

 /**
 * 返回true則為找到一條路 返回false為死路
 */
 private boolean generateDfs(char[][] board, char[] wordChar, int i, int j, int index) {
 // 碰到邊 或者碰到已經(jīng)走過(guò)的位置 不能走了 死路
 if (i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] == '/') {
  return false;
 }

 // 擺放一個(gè)字母
 board[i][j] = wordChar[index];

 //如果已經(jīng)達(dá)到單詞長(zhǎng)度則直接返回 找到一條路
 if (index == wordChar.length - 1) {
  return true;
 }

 // 記錄當(dāng)前矩陣元素
 char tmp = board[i][j];
 // 修改為/ 表示已經(jīng)訪(fǎng)問(wèn)過(guò)
 board[i][j] = '/';

 // 向上下左右四個(gè)方向開(kāi)啟遞歸
 // 查看能走幾個(gè)方向 隨機(jī)選擇一個(gè)
 List<int[]> directions = Arrays.asList(new int[]{-1, 0}, new int[]{1, 0}, new int[]{0, -1}, new int[]{0, 1});
 Collections.shuffle(directions);

 boolean res = false;
 for (int k = 0; k < directions.size(); k++) {
  int di = i + directions.get(k)[0], dj = j + directions.get(k)[1];
  boolean partialRes = generateDfs(board, wordChar, di, dj, index + 1);
  if (k == 0) {
  res = partialRes;
  } else {
  res = res || partialRes;
  }
  // 如果res為true 說(shuō)明找到一條路 就不再遍歷了 還原后返回true
  if (res) {
  // 還原矩陣元素
  board[i][j] = tmp;
  return true;
  }
 }
 // 還原矩陣元素
 board[i][j] = '*';
 return false;
 }
}

運(yùn)行結(jié)果




以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring?Boot實(shí)現(xiàn)消息的發(fā)送和接收使用實(shí)戰(zhàn)指南

    Spring?Boot實(shí)現(xiàn)消息的發(fā)送和接收使用實(shí)戰(zhàn)指南

    這篇文章主要為大家介紹了Spring?Boot實(shí)現(xiàn)消息的發(fā)送和接收使用實(shí)戰(zhàn)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Mybatis之mapper接口多參數(shù)方式

    Mybatis之mapper接口多參數(shù)方式

    這篇文章主要介紹了Mybatis之mapper接口多參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 淺談Java面向?qū)ο笾畠?nèi)部類(lèi)

    淺談Java面向?qū)ο笾畠?nèi)部類(lèi)

    內(nèi)部類(lèi)是一個(gè)非常有用的特性但又比較難理解使用的特性,我們從外面看是非常容易理解的,無(wú)非就是在一個(gè)類(lèi)的內(nèi)部在定義一個(gè)類(lèi)。其實(shí)使用內(nèi)部類(lèi)最大的優(yōu)點(diǎn)就在于它能夠非常好的解決多重繼承的問(wèn)題
    2021-06-06
  • Java連接Mysql數(shù)據(jù)庫(kù)詳細(xì)代碼實(shí)例

    Java連接Mysql數(shù)據(jù)庫(kù)詳細(xì)代碼實(shí)例

    這篇文章主要介紹了Java連接Mysql數(shù)據(jù)庫(kù)詳細(xì)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java應(yīng)該在哪里判斷List是否為空

    Java應(yīng)該在哪里判斷List是否為空

    在Java中,我們常用List來(lái)存儲(chǔ)數(shù)據(jù),但是我們?cè)趺磁袛嗨欠癯晒?lái)了我們需要的數(shù)據(jù)呢?下面這篇文章主要給大家介紹了關(guān)于Java應(yīng)該在哪里判斷List是否為空的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Java通過(guò)反射機(jī)制將對(duì)象封裝成JSON和JsonArray格式

    Java通過(guò)反射機(jī)制將對(duì)象封裝成JSON和JsonArray格式

    這篇文章主要介紹了Java通過(guò)反射機(jī)制將對(duì)象封裝成JSON和JsonArray格式,JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)實(shí)體類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法,需要的朋友可以參考下
    2023-10-10
  • 如何基于LoadingCache實(shí)現(xiàn)Java本地緩存

    如何基于LoadingCache實(shí)現(xiàn)Java本地緩存

    這篇文章主要介紹了如何基于LoadingCache實(shí)現(xiàn)Java本地緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 關(guān)于Springboot+gateway整合依賴(lài)并處理依賴(lài)沖突問(wèn)題

    關(guān)于Springboot+gateway整合依賴(lài)并處理依賴(lài)沖突問(wèn)題

    這篇文章主要介紹了Springboot+gateway整合依賴(lài)并處理依賴(lài)沖突問(wèn)題,給大家提到了spring boot版本和spring cloud版本,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Eclipse連接Mysql數(shù)據(jù)庫(kù)操作總結(jié)

    Eclipse連接Mysql數(shù)據(jù)庫(kù)操作總結(jié)

    這篇文章主要介紹了Eclipse連接Mysql數(shù)據(jù)庫(kù)操作總結(jié)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • java彩色瓷磚編程題分析

    java彩色瓷磚編程題分析

    這篇文章主要介紹了java彩色瓷磚編程題的詳細(xì)解題思路以及解決方法分享,對(duì)此有興趣的參考下。
    2018-02-02

最新評(píng)論

凌云县| 临邑县| 邹平县| 阳新县| 正定县| 宕昌县| 威宁| 梁平县| 来凤县| 简阳市| 皮山县| 怀化市| 东源县| 达拉特旗| 玉环县| 武邑县| 乐平市| 综艺| 张家川| 吴川市| 桃园县| 卫辉市| 廉江市| 清苑县| 瓮安县| 论坛| 卓资县| 洛隆县| 依安县| 阳高县| 河东区| 东城区| 巩义市| 德化县| 克东县| 株洲县| 法库县| 昌平区| 合肥市| 聊城市| 儋州市|