1. 程式人生 > >解題1(Suduku)

解題1(Suduku)

邏輯 目前 empty pre value const urn point lis

題目描述

問題描述:數獨(Sudoku)是一款大眾喜愛的數字邏輯遊戲。玩家需要根據9X9盤面上的已知數字,推算出所有剩余空格的數字,並且滿足每一行、每一列、每一個粗線宮內的數字均含1-9,並且不重復。
輸入:
包含已知數字的9X9盤面數組[空缺位以數字0表示]
輸出:
完整的9X9盤面數組

輸入描述:

包含已知數字的9X9盤面數組[空缺位以數字0表示]

輸出描述:

完整的9X9盤面數組

示例1

輸入

0 9 2 4 8 1 7 6 3
4 1 3 7 6 2 9 8 5
8 6 7 3 5 9 4 1 2
6 2 4 1 9 5 3 7 8
7 5 9 8 4 3 1 2 6
1 3 8 6 2 7 5 9 4
2 7 1 5 3 8 6 4 9
3 8 6 9 1 4 2 5 7
0 4 5 2 7 6 8 3 1

輸出

5 9 2 4 8 1 7 6 3
4 1 3 7 6 2 9 8 5
8 6 7 3 5 9 4 1 2
6 2 4 1 9 5 3 7 8
7 5 9 8 4 3 1 2 6
1 3 8 6 2 7 5 9 4
2 7 1 5 3 8 6 4 9
3 8 6 9 1 4 2 5 7
9 4 5 2 7 6 8 3 1

package com.yaode;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Suduku {

public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[][]=new int[9][9];
Scanner scanner=new Scanner(System.in);
List<Point>pointList=new ArrayList<Point>();
for (int i = 0; i < arr.length; i++) {

String[] temp=scanner.nextLine().split(" ");
for (int j = 0; j < arr.length; j++) {
arr[i][j]=Integer.parseInt(temp[j]);
if(arr[i][j]==0){
pointList.add(new Point(i, j));
}
}
}
scanner.close();

int empty=pointList.size();
List<Integer> resultList=new ArrayList<>();//對暫時找到的合適的值進行記錄
int value=1;
while (true) {
if (resultList.size()==empty) {//找到所有合適值時退出
break;
}
for (; value < 10; value++) {
if (valid(arr, pointList.get(resultList.size()).row,
pointList.get(resultList.size()).col, value)) {
resultList.add(value);//記錄暫時找到的合適的值
//對暫時找到的值放入arr(找後面的值驗證時要用到)
arr[pointList.get(resultList.size()-1).row][pointList.get(resultList.size()-1).col]=value;
break;//結束對目前空格的查找
}

}
if (value==10) {//如果目前空格沒找到合適的值
//將目前空格的前一個空格的值致零(要從新查找合適的值)
arr[pointList.get(resultList.size()-1).row][pointList.get(resultList.size()-1).col]=0;
//在記錄resultList中刪除目前空格的前一個記錄,後面查找時從記錄值加一(+1)開始查找
value=resultList.remove(resultList.size()-1)+1;
}else {
value=1;//從1開始查找下一個空格的合適值
}
}


for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length-1; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println(arr[i][8]);
}



}



private static boolean valid(int[][] arr,int row,int col,int value) {//驗證value是否合適
for (int i = 0; i < arr.length; i++) {//行
if(arr[row][i]==value){
return false;
}
}

for (int i = 0; i < arr.length; i++) {//列
if (arr[i][col]==value) {
return false;
}
}

int startRow=row/3*3;
int endRow=startRow+2;
int startCol=col/3*3;
int endCol=startCol+2;

for (int i = startRow; i <= endRow; i++) {//所在小宮格
for (int j = startCol; j <= endCol; j++) {
if (arr[i][j]==value) {
return false;
}
}
}

return true;

}

}

class Point{
int row;
int col;
public Point(int row,int col) {
// TODO Auto-generated constructor stub
this.row=row;
this.col=col;
}
}





解題1(Suduku)