天地无极,乾坤剑法

导航

 

题目描述

问题描述:数独(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 }

 





posted on 2017-11-03 15:46  天地无极,乾坤剑法  阅读(494)  评论(0)    收藏  举报