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

java版數(shù)獨游戲核心算法(一)

 更新時間:2017年12月18日 13:41:00   作者:I-Awakening  
這篇文章主要為大家詳細(xì)介紹了java版數(shù)獨游戲的核心算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

之前學(xué)習(xí)javascript時用javascript寫過一個數(shù)獨游戲,最近看了一點java的內(nèi)容,于是就心血來潮想搞一個java版的數(shù)獨游戲。

現(xiàn)在將全部代碼分享出來和大家學(xué)習(xí)交流,當(dāng)然代碼中有著各種各樣的問題和不足之處,望各位朋友批評指點。

以下是生成數(shù)獨地圖的核心算法,算法不是很好,也是之前參考過網(wǎng)上的一些思想:

package hlc.shudu.src;

/*
 * 數(shù)獨的幫助類,里面提供數(shù)據(jù)所需的所有算法
 */
public class ShuduHelper {
 //數(shù)獨地圖數(shù)組
 private static int[][] maps = new int[9][9];
 //每個小九宮格可放置位置的數(shù)
 private static int[] canPutSum = new int[9];
 //用來存儲之前放置過的位置
 static int[] used = new int[9];
 //是否已經(jīng)完成地圖的生成
 static boolean isOk = true;

 /*
  * 得到數(shù)獨地圖數(shù)組
  */
 public static int[][] getMap() {
 //判斷是否已經(jīng)完成地圖的生成,要是沒有完成就重新生成。
 //從這里就可以看出算法還有待優(yōu)化,如果回溯的好的話就一直可以通過回溯來重新生成,而這里是通過重新執(zhí)行生成算法來重新生成。希望感興趣的朋友可以去實現(xiàn)以下。
  do{
   isOk = true;
   initMaps();
  }while(!isOk);
  return maps;
 }

 /*
  * 初始化maps
  */
 private static void initMaps() {
  // 初始化地圖數(shù)組中沒有填入任何數(shù)字
  for (int i = 0; i < 9; i++) {
   for (int j = 0; j < 9; j++) {
    maps[i][j] = -1;
   }
  }

  // 依次填入1~9
  for (int num = 1; num <= 9; num++) {
   for (int i = 0; i < 9; i++) {
    used[i] = -1;
    canPutSum[i] = -1;
   }
   // 遍歷大九宮格中的每個小九宮格
   for (int i = 0; i < 9; i++) {
    if (canPutSum[i]==-1) {
     canPutSum[i] = getCanPutSum(i, num);
    }
    if (canPutSum[i]==1) {
     used[i] = -1;
    }

    if (canPutSum[i] == 0) {
     canPutSum[i] = -1;
     used[i] = -1;
     // 如果當(dāng)前小九宮格中不能放入數(shù)字num,則回到前一個小九宮格
     if (i > 0) {
      // 將前一個九宮格中放num的位置清空
      if (used[i-1]!=-1) {
       //maps[(int) (Math.floor(used[i-1]/3)+Math.floor((i-1)/3)*3)][used[i-1]%3+((i-1)%3)*3]=-1;
       clearNum(i - 1, num);
      }
      // i回退一個,因為等會for循環(huán)灰給i加一,所以這里減2
      i -= 2;
      continue;
     } else {
      isOk = false;
      return;
     }
    } else {
     // 將num放入當(dāng)前小九宮格中
     boolean flag = false;
     while (!flag) {
      int j = (int) (Math.random() * 9);
      // 當(dāng)前小方格橫坐標(biāo)
      int ii = (i / 3) * 3 + j / 3;
      // 當(dāng)前小方格縱坐標(biāo)
      int jj = (i % 3) * 3 + j % 3;
      //System.out.println("num:"+num+"\tii:"+ii+"\tjj:"+jj);
      // 如果可以放置num則放置
      if (maps[ii][jj] == -1 && j!=used[i] && isCanPut(ii, jj, num)) {
       maps[ii][jj] = num;
       used[i] = j;
       canPutSum[i] -= 1;
       flag = true;
      }

     }
    }

   }
  }

 }

 /*
  * 清空第i個小九宮格中的num
  */
 private static void clearNum(int i, int num) {
  for (int j = 0; j < 9; j++) {
   // 當(dāng)前小方格橫坐標(biāo)
   int ii = (i / 3) * 3 + j / 3;
   // 當(dāng)前小方格縱坐標(biāo)
   int jj = (i % 3) * 3 + j % 3;
   // 判斷當(dāng)前小方格是否可以放置
   if (maps[ii][jj] == num) {
    maps[ii][jj] = -1;
   }
  }

 }

 /*
  * 得到當(dāng)前小九宮格可以放入數(shù)字num的位置數(shù)目
  */
 private static int getCanPutSum(int i, int num) {
  int sum = 0;
  // 遍歷小九宮格
  for (int j = 0; j < 9; j++) {
   // 當(dāng)前小方格橫坐標(biāo)
   int ii = (i / 3) * 3 + j / 3;
   // 當(dāng)前小方格縱坐標(biāo)
   int jj = i % 3 * 3 + j % 3;
   // 判斷當(dāng)前小方格是否可以放置
   if (maps[ii][jj] == -1 && isCanPut(ii, jj, num)) {
    ++sum;
   }
  }

  return sum;

 }

 /*
  * 指定橫縱坐標(biāo)點是否可以放置num
  */
 private static boolean isCanPut(int ii, int jj, int num) {
  // 判斷指定坐標(biāo)點的同行或同列是否有相同數(shù)字,要是有則為false
  for (int i = 0; i < 9; i++) {
   if (maps[ii][i] == num) {
    return false;
   }
   if (maps[i][jj] == num) {
    return false;
   }
  }
  return true;
 }
}

完整程序包可在GitHub上下載:https://github.com/houlongchao/s

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

相關(guān)文章

  • SpringBoot事件發(fā)布和監(jiān)聽詳解

    SpringBoot事件發(fā)布和監(jiān)聽詳解

    今天去官網(wǎng)查看spring boot資料時,在特性中看見了系統(tǒng)的事件及監(jiān)聽章節(jié),所以下面這篇文章主要給大家介紹了關(guān)于SpringBoot事件發(fā)布和監(jiān)聽的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • java實現(xiàn)統(tǒng)計字符串中大寫字母,小寫字母及數(shù)字出現(xiàn)次數(shù)的方法示例

    java實現(xiàn)統(tǒng)計字符串中大寫字母,小寫字母及數(shù)字出現(xiàn)次數(shù)的方法示例

    這篇文章主要介紹了java實現(xiàn)統(tǒng)計字符串中大寫字母,小寫字母及數(shù)字出現(xiàn)次數(shù)的方法,涉及java針對字符串的遍歷、判斷、運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • maven依賴關(guān)系中的<scope>provided</scope>使用詳解

    maven依賴關(guān)系中的<scope>provided</scope>使用詳解

    這篇文章主要介紹了maven依賴關(guān)系中的<scope>provided</scope>使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java多線程高并發(fā)中解決ArrayList與HashSet和HashMap不安全的方案

    Java多線程高并發(fā)中解決ArrayList與HashSet和HashMap不安全的方案

    ArrayList實現(xiàn)了可變大小的數(shù)組。它允許所有元素,包括null。ArrayList沒有同步,HashMap和Hashtable類似,不同之處在于HashMap是非同步的,并且允許null,關(guān)于HashSet有一件事應(yīng)該牢記,即就條目數(shù)和容量之和來講,迭代是線性的,接下來讓我們詳細(xì)來了解吧
    2021-11-11
  • Java Socket實現(xiàn)多線程通信功能示例

    Java Socket實現(xiàn)多線程通信功能示例

    這篇文章主要介紹了Java Socket實現(xiàn)多線程通信功能,結(jié)合具體實例形式較為詳細(xì)的分析了java多線程通信的原理及客戶端、服務(wù)器端相應(yīng)實現(xiàn)技巧,需要的朋友可以參考下
    2017-06-06
  • SpringBoot中的yml文件中讀取自定義配置信息及遇到問題小結(jié)

    SpringBoot中的yml文件中讀取自定義配置信息及遇到問題小結(jié)

    這篇文章主要介紹了SpringBoot中的yml文件中讀取自定義配置信息,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • Springboot文件上傳出現(xiàn)找不到指定系統(tǒng)路徑的解決

    Springboot文件上傳出現(xiàn)找不到指定系統(tǒng)路徑的解決

    這篇文章主要介紹了Springboot文件上傳出現(xiàn)找不到指定系統(tǒng)路徑的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring/Spring Boot 中優(yōu)雅地做參數(shù)校驗拒絕 if/else 參數(shù)校驗

    Spring/Spring Boot 中優(yōu)雅地做參數(shù)校驗拒絕 if/else 參數(shù)校驗

    這篇文章主要介紹了Spring/Spring Boot 中優(yōu)雅地做參數(shù)校驗拒絕 if/else 參數(shù)校驗,本文使用最新的 Spring Boot 版本 2.4.5,通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-04-04
  • 解決idea找不到或無法加載主類的錯誤處理

    解決idea找不到或無法加載主類的錯誤處理

    這篇文章主要介紹了解決idea找不到或無法加載主類的錯誤處理,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Spring boot外部配置(配置中心化)詳解

    Spring boot外部配置(配置中心化)詳解

    這篇文章主要給大家介紹了關(guān)于Spring boot外部配置(配置中心化)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12

最新評論

福泉市| 大港区| 大关县| 苏尼特左旗| 武功县| 蚌埠市| 卓尼县| 夏津县| 遂平县| 富锦市| 开原市| 淮阳县| 自治县| 龙口市| SHOW| 东源县| 全州县| 远安县| 东城区| 浏阳市| 渝北区| 连州市| 龙里县| 崇阳县| 德惠市| 来安县| 磐石市| 嘉定区| 会东县| 桦川县| 揭阳市| 鹤岗市| 隆昌县| 卢龙县| 翁牛特旗| 天台县| 衡阳县| 馆陶县| 吕梁市| 修水县| 兴仁县|