1. 程式人生 > >數獨遊戲的兩種程式設計思路+程式碼

數獨遊戲的兩種程式設計思路+程式碼

###數獨
方法一:
設定三個方法;分別為行不重複,列不重複,單元格不重複;在判斷是否重複的時候用了一個Boolean陣列,預設值為false,若角標位置為true時那麼說明已經重複了

需求:判斷是否為數獨矩陣
 /* 思路:當每行元素不得重複,並且每列元素不得重複,並且每個小方陣也不得重複*/
 public static void main(String[] args) {
		// TODO Auto-generated method stub
		int grid[][]={
				{5,3,4,6,7,8,9,1,2},
				{6,7,2,1,9,5,3,4,8},
				{
1,9,8,3,4,2,5,6,7}, {8,5,9,7,6,1,4,2,3}, {4,2,6,8,5,3,7,9,1}, {7,1,3,9,2,4,8,5,6}, {9,6,1,5,3,7,2,8,4}, {2,8,7,4,1,9,6,3,5}, {3,4,5,2,8,6,1,7,9}}; if(IsAllrow(grid)&&IsAllcol(grid)&&IsAllcell(grid)){ System.out.println("是 數獨"); }else{ System.out.println
("不是數獨"); } } private static boolean IsAllcell(int[][] grid) { // TODO Auto-generated method stub //找基點 for(int i=0;i<9;i+=3){ for(int j=0;j<9;j+=3){ //找偏移量,小矩陣 boolean cell[]=new boolean[9]; for(int x=0;x<3;x++){ for(int y=0;y<3;y++){ if(cell[grid[x+i][y+j]-1]
==false){ cell[grid[x+i][y+j]-1]=true; }else{ return false; } } } } } return true; } private static boolean IsAllcol(int[][] grid) { // TODO Auto-generated method stub for(int i=0;i<grid.length;i++){ boolean row[]=new boolean[9]; for(int j=0;j<grid[i].length;j++){ if(row[grid[j][i]-1]==false){ row[grid[j][i]-1]=true; }else{ return false; } } } return true; } private static boolean IsAllrow(int[][] grid) { // TODO Auto-generated method stub for(int i=0;i<grid.length;i++){ boolean row[]=new boolean[9]; for(int j=0;j<grid[i].length;j++){ if(row[grid[i][j]-1]==false){ row[grid[i][j]-1]=true; }else{ return false; } } } return true; } }

方法二:
依然是判斷行不能重複列不能重複,這個用的方法是,分為以下幾個情況:
一個大情況為grid裡的數字不能超過1-9;基於大情況的前提
我們拿出一行,看這一行裡有沒有和某一個數字相同,那就是行不變列編,並且去除自己本身你這列,比的是這行的其他列;
我們再拿出一列,看這一列裡有沒有和這個數字相同的,那就是列不變行變,並且去除自己本身你這行,比的是這列的其他行;
我們再拿出一個單元格,看這個單元格里有沒有和這個數字相同的,並且去除本身的行列,比的是剩餘單元格的元素。


public class Demo_test3_1 {

   public static void main(String[] args) {
   	// TODO Auto-generated method stub
   	int grid[][]={
   			{5,3,4,6,7,8,9,1,2},
   			{6,7,2,1,9,5,3,4,8},
   			{1,9,8,3,4,2,5,6,7},
   			{8,5,9,7,6,1,4,2,3},
   			{4,2,6,8,5,3,7,9,1},
   			{7,1,3,9,2,4,8,5,6},
   			{9,6,1,5,3,7,2,8,4},
   			{2,8,7,4,1,9,6,3,5},
   			{3,4,5,2,8,6,1,7,9}
   			};
   System.out.println(Isvalid(grid)?"Valid solution":"Not valid solution");
   }

   private static boolean Isvalid(int[][] grid) {
   	// TODO Auto-generated method stub
   	for (int  i= 0; i < grid.length; i++) {
   		for (int j = 0; j < grid[i].length; j++) {
   			if(grid[i][j]<1||grid[i][j]>9) {
   				return false;
   			}
   		}
   	}
   	return true;
   	
   }
   public static boolean Isvalid(int [][]grid,int i,int j) {
   	for(int colume=0;colume<9;colume++) {
   		if(colume!=j&&grid[i][colume]==grid[i][j]) {//i行中的元素,與grid[i][j]這個元素比有重複的
   			return false;
   		}
   	}
   	for(int row=0;row<9;row++) {
   		if(row!=i&&grid[i][j]==grid[row][j]) {
   			return false;
   		}
   	}
   	for(int row=(i/3)*3;row<9;row++) {
   		for(int col=(j/3)*3;col<9;col++) {
   			if(row!=i&&col!=j&&grid[i][j]==grid[row][col]) {
   				return false;
   			}
   		}
   	}
   return true;	
   }
}