国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

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

2024-07-13 10:14:52
字體:
來源:轉載
供稿:網友

之前學習javascript時用javascript寫過一個數獨游戲,最近看了一點java的內容,于是就心血來潮想搞一個java版的數獨游戲。

現在將全部代碼分享出來和大家學習交流,當然代碼中有著各種各樣的問題和不足之處,望各位朋友批評指點。

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

package hlc.shudu.src;/* * 數獨的幫助類,里面提供數據所需的所有算法 */public class ShuduHelper { //數獨地圖數組 private static int[][] maps = new int[9][9]; //每個小九宮格可放置位置的數 private static int[] canPutSum = new int[9]; //用來存儲之前放置過的位置 static int[] used = new int[9]; //是否已經完成地圖的生成 static boolean isOk = true; /*  * 得到數獨地圖數組  */ public static int[][] getMap() { //判斷是否已經完成地圖的生成,要是沒有完成就重新生成。 //從這里就可以看出算法還有待優化,如果回溯的好的話就一直可以通過回溯來重新生成,而這里是通過重新執行生成算法來重新生成。希望感興趣的朋友可以去實現以下。  do{   isOk = true;   initMaps();  }while(!isOk);  return maps; } /*  * 初始化maps  */ private static void initMaps() {  // 初始化地圖數組中沒有填入任何數字  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;     // 如果當前小九宮格中不能放入數字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循環灰給i加一,所以這里減2      i -= 2;      continue;     } else {      isOk = false;      return;     }    } else {     // 將num放入當前小九宮格中     boolean flag = false;     while (!flag) {      int j = (int) (Math.random() * 9);      // 當前小方格橫坐標      int ii = (i / 3) * 3 + j / 3;      // 當前小方格縱坐標      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++) {   // 當前小方格橫坐標   int ii = (i / 3) * 3 + j / 3;   // 當前小方格縱坐標   int jj = (i % 3) * 3 + j % 3;   // 判斷當前小方格是否可以放置   if (maps[ii][jj] == num) {    maps[ii][jj] = -1;   }  } } /*  * 得到當前小九宮格可以放入數字num的位置數目  */ private static int getCanPutSum(int i, int num) {  int sum = 0;  // 遍歷小九宮格  for (int j = 0; j < 9; j++) {   // 當前小方格橫坐標   int ii = (i / 3) * 3 + j / 3;   // 當前小方格縱坐標   int jj = i % 3 * 3 + j % 3;   // 判斷當前小方格是否可以放置   if (maps[ii][jj] == -1 && isCanPut(ii, jj, num)) {    ++sum;   }  }  return sum; } /*  * 指定橫縱坐標點是否可以放置num  */ private static boolean isCanPut(int ii, int jj, int num) {  // 判斷指定坐標點的同行或同列是否有相同數字,要是有則為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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁德市| 白河县| 安义县| 邵阳县| 茌平县| 广宗县| 井研县| 斗六市| 西乡县| 安吉县| 台山市| 会理县| 西吉县| 肇源县| 霍州市| 平定县| 林口县| 临桂县| 平陆县| 合水县| 大新县| 龙井市| 依安县| 砚山县| 青龙| 大埔区| 高邑县| 深圳市| 贺兰县| 石楼县| 普兰店市| 乡城县| 当阳市| 平阴县| 新巴尔虎左旗| 楚雄市| 襄樊市| 滕州市| 襄樊市| 新宁县| 诏安县|