数独游戏的算法实现
首先,數(shù)獨(dú)游戲的界面是由9*9共81個(gè)方框組成,每個(gè)方框內(nèi)填入1-9之間數(shù)字,部分方框已經(jīng)填入了數(shù)字,玩家需要根據(jù)已有數(shù)字推測并填入空白方框。
如圖所示:
數(shù)獨(dú)游戲規(guī)則非常簡單,滿足一下三條規(guī)則:
如果要制作一個(gè)數(shù)獨(dú)游戲,首先需要生成一組完整的滿足數(shù)獨(dú)規(guī)則的數(shù)據(jù)。那么這里就來介紹一種簡單的生成算法。
第一步,考慮到數(shù)組的規(guī)則和數(shù)字組成方式,我們先將數(shù)組劃分為9個(gè)3*3的格網(wǎng),用二維數(shù)組a[3][3]表示,每個(gè)格網(wǎng)內(nèi)又有3*3個(gè)小方框,同樣用二維數(shù)組表示b[3][3],那么整個(gè)數(shù)獨(dú)數(shù)組由數(shù)組a和b組合后可以用一個(gè)四維數(shù)組表示c[3][3][3][3]。
第二步,由于每個(gè)3*3格網(wǎng)必須滿足1-9不重復(fù),那么首先采用隨機(jī)方式生成第一個(gè)格網(wǎng)數(shù)組;
第三步,根據(jù)第一個(gè)格網(wǎng),在橫向上生成另外兩個(gè)格網(wǎng),根據(jù)數(shù)組規(guī)則,橫向兩個(gè)格網(wǎng)不能與第一個(gè)格網(wǎng)排列規(guī)則相同,此時(shí)需要對(duì)第一個(gè)網(wǎng)格數(shù)字進(jìn)行排列組合,首先橫向上順序不能變化,只能在縱向上調(diào)整位置,以此生成另外兩個(gè)格網(wǎng),這樣就完成了9個(gè)3*3格網(wǎng)第一行的排列;
第四步,對(duì)剩余格網(wǎng)的排列。剩余格網(wǎng)通過第一行已有格網(wǎng),每一列參考第一列格網(wǎng)進(jìn)行豎向上排列組合,同樣可以生成另外兩個(gè)格網(wǎng),完成剩余三列的格網(wǎng)生成后,整個(gè)數(shù)獨(dú)游戲的數(shù)字就全部組合完畢。
實(shí)現(xiàn)代碼:
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(); // 創(chuàng)建第一個(gè)格網(wǎng)createFirstLineXGrid(); // 創(chuàng)建第一行另外兩個(gè)格網(wǎng)createRestGrid(); //生成剩余格網(wǎng)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();} }?
總結(jié)
- 上一篇: DEM挖填方分析--基于水平参考面计算
- 下一篇: 使用gdal和java对TIF格式正射影