91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-25 07:03:44 來源:腳本之家 閱讀:129 作者:I-Awakening 欄目:編程語言

之前學習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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泾川县| 宣城市| 花垣县| 大理市| 酒泉市| 南平市| 隆化县| 恩平市| 克东县| 岗巴县| 三门县| 仪陇县| 南开区| 广州市| 鹤庆县| 长春市| 甘谷县| 赞皇县| 宿迁市| 浦县| 塔城市| 抚顺县| 南丰县| 翁源县| 定日县| 蒲江县| 增城市| 平阴县| 梅河口市| 扬州市| 晋中市| 景谷| 汉中市| 德保县| 阜南县| 五寨县| 喀什市| 灵川县| 商都县| 徐闻县| 互助|