數獨遊戲的兩種程式設計思路+程式碼
阿新 • • 發佈:2018-11-21
###數獨
方法一:
設定三個方法;分別為行不重複,列不重複,單元格不重複;在判斷是否重複的時候用了一個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;
}
}