数独游戏的算法实现
首先,數獨游戲的界面是由9*9共81個方框組成,每個方框內填入1-9之間數字,部分方框已經填入了數字,玩家需要根據已有數字推測并填入空白方框。
如圖所示:
數獨游戲規則非常簡單,滿足一下三條規則:
如果要制作一個數獨游戲,首先需要生成一組完整的滿足數獨規則的數據。那么這里就來介紹一種簡單的生成算法。
第一步,考慮到數組的規則和數字組成方式,我們先將數組劃分為9個3*3的格網,用二維數組a[3][3]表示,每個格網內又有3*3個小方框,同樣用二維數組表示b[3][3],那么整個數獨數組由數組a和b組合后可以用一個四維數組表示c[3][3][3][3]。
第二步,由于每個3*3格網必須滿足1-9不重復,那么首先采用隨機方式生成第一個格網數組;
第三步,根據第一個格網,在橫向上生成另外兩個格網,根據數組規則,橫向兩個格網不能與第一個格網排列規則相同,此時需要對第一個網格數字進行排列組合,首先橫向上順序不能變化,只能在縱向上調整位置,以此生成另外兩個格網,這樣就完成了9個3*3格網第一行的排列;
第四步,對剩余格網的排列。剩余格網通過第一行已有格網,每一列參考第一列格網進行豎向上排列組合,同樣可以生成另外兩個格網,完成剩余三列的格網生成后,整個數獨游戲的數字就全部組合完畢。
實現代碼:
import java.util.ArrayList; import java.util.List; import java.util.Random;public class CaculateSudokuNumbers {int[][][][] arr;private void initArr() {arr = new int[3][3][3][3];fillArr();}private void fillArr() {creatFirstGrid(); // 創建第一個格網createFirstLineXGrid(); // 創建第一行另外兩個格網createRestGrid(); //生成剩余格網for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {System.out.println(arr[i][j][0][0] + "," + arr[i][j][0][1] + "," + arr[i][j][0][2] + ","+ arr[i][j][1][0] + "," + arr[i][j][1][1] + "," + arr[i][j][1][2] + "," + arr[i][j][2][0] + ","+ arr[i][j][2][1] + "," + arr[i][j][2][2]);}}}private void creatFirstGrid() {List<Integer> tempList = new ArrayList<>();for (int i = 1; i <= 9; i++) {tempList.add(i);}for (int i = 0; i < 9; i++) {int size = tempList.size();int x = i % 3;int y = i / 3;Random random = new Random();int index = random.nextInt(size);arr[0][0][y][x] = tempList.get(index);tempList.remove(index);}}private void createFirstLineXGrid() {int[] arr1 = new int[] { 2, 0, 1 };int[] arr2 = new int[] { 1, 2, 0 };for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {int yIndex = arr1[i];arr[0][1][i][j] = arr[0][0][yIndex][j];}}for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {int yIndex = arr2[i];arr[0][2][i][j] = arr[0][0][yIndex][j];}}}private void createRestGrid() {int[] arr1 = new int[] { 2, 0, 1 };int[] arr2 = new int[] { 1, 2, 0 };for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {int xIndex = arr1[j];for (int k = 0; k < 3; k++) {arr[1][i][k][j] = arr[0][i][k][xIndex];}}for (int j = 0; j < 3; j++) {int xIndex = arr2[j];for (int k = 0; k < 3; k++) {arr[2][i][k][j] = arr[0][i][k][xIndex];}}}}public static void main(String[] args) {new CaculateSudokuNumbers().initArr();} }?
總結
- 上一篇: DEM挖填方分析--基于水平参考面计算
- 下一篇: 使用gdal和java对TIF格式正射影