题目描述
问题描述:数独(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
代码如下:
1 package com.yaode; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.Scanner; 6 public class Suduku { 7 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub 10 int arr[][]=new int[9][9]; 11 Scanner scanner=new Scanner(System.in); 12 List<Point>pointList=new ArrayList<Point>(); 13 for (int i = 0; i < arr.length; i++) { 14 15 String[] temp=scanner.nextLine().split(" "); 16 for (int j = 0; j < arr.length; j++) { 17 arr[i][j]=Integer.parseInt(temp[j]); 18 if(arr[i][j]==0){ 19 pointList.add(new Point(i, j)); 20 } 21 } 22 } 23 scanner.close(); 24 25 int empty=pointList.size(); 26 List<Integer> resultList=new ArrayList<>();//对暂时找到的合适的值进行记录 27 int value=1; 28 while (true) { 29 if (resultList.size()==empty) {//找到所有合适值时退出 30 break; 31 } 32 for (; value < 10; value++) { 33 if (valid(arr, pointList.get(resultList.size()).row, 34 pointList.get(resultList.size()).col, value)) { 35 resultList.add(value);//记录暂时找到的合适的值 36 //对暂时找到的值放入arr(找后面的值验证时要用到) 37 arr[pointList.get(resultList.size()-1).row][pointList.get(resultList.size()-1).col]=value; 38 break;//结束对目前空格的查找 39 } 40 41 } 42 if (value==10) {//如果目前空格没找到合适的值 43 //将目前空格的前一个空格的值致零(要从新查找合适的值) 44 arr[pointList.get(resultList.size()-1).row][pointList.get(resultList.size()-1).col]=0; 45 //在记录resultList中删除目前空格的前一个记录,后面查找时从记录值加一(+1)开始查找 46 value=resultList.remove(resultList.size()-1)+1; 47 }else { 48 value=1;//从1开始查找下一个空格的合适值 49 } 50 } 51 52 53 for (int i = 0; i < arr.length; i++) { 54 for (int j = 0; j < arr.length-1; j++) { 55 System.out.print(arr[i][j]+" "); 56 } 57 System.out.println(arr[i][8]); 58 } 59 60 61 62 } 63 64 65 66 private static boolean valid(int[][] arr,int row,int col,int value) {//验证value是否合适 67 for (int i = 0; i < arr.length; i++) {//行 68 if(arr[row][i]==value){ 69 return false; 70 } 71 } 72 73 for (int i = 0; i < arr.length; i++) {//列 74 if (arr[i][col]==value) { 75 return false; 76 } 77 } 78 79 int startRow=row/3*3; 80 int endRow=startRow+2; 81 int startCol=col/3*3; 82 int endCol=startCol+2; 83 84 for (int i = startRow; i <= endRow; i++) {//所在小宫格 85 for (int j = startCol; j <= endCol; j++) { 86 if (arr[i][j]==value) { 87 return false; 88 } 89 } 90 } 91 92 return true; 93 94 } 95 96 97 } 98 99 class Point{ 100 int row; 101 int col; 102 public Point(int row,int col) { 103 // TODO Auto-generated constructor stub 104 this.row=row; 105 this.col=col; 106 } 107 }
浙公网安备 33010602011771号