华为机试---数独

来源:互联网 发布:网络营销策划书 编辑:程序博客网 时间:2024/05/21 19:33


题目描述

数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。
输入一个9×9的格:
7 2 6 9 0 4 0 5 1
0 8 0 6 0 7 4 3 2
3 4 1 0 8 5 0 0 9
0 5 2 4 6 8 0 0 7
0 3 7 0 0 0 6 8 0
0 9 0 0 0 3 0 1 0
0 0 0 0 0 0 0 0 0
9 0 0 0 2 1 5 0 0
8 0 0 3 0 0 0 0 0
其中非0的数就是系统预先定义的数字,为0的就是要填数的格。最后,填满数的格不论横,竖及区都不能有重复的数字。
输入描述:
输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。
输出描述:
输出九行,每行九个空格隔开的数字,为解出的答案
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner scan = new Scanner(System.in);        int[][] data = new int[9][9];        while (scan.hasNext()) {         for(int i = 0 ; i < 9 ; i++){          for(int j = 0 ; j < 9 ; j++){           data[i][j] = scan.nextInt();          }         }         solveSudoku(data , 0);                 }//endwhile          scan.close();    }    /**     * 数独问题求解     * @param data已知的待填充的数组     * @param data_count统计已经填充完整的元素的个数     * */    public static void solveSudoku(int[][] data , int count_num){     //只打印符合条件的一个填充,结果不唯一     if(count_num == 81){         print(data);            System.exit(0);//程序正常退出    return; 还会打印其他符合条件的     }else{         int row = count_num / 9;         int col = count_num % 9;         if(data[row][col] != 0){          solveSudoku(data , count_num + 1);         }else{          for(int key = 1 ; key <= 9 ; key++){     if(canBePlaced(data , row , col , key)){      data[row][col] = key;      solveSudoku(data, count_num + 1);      data[row][col] = 0;                }    } //endfor key           }     }         //     print(data);    }    /**     * 判断数字是否可以被放置在某个位置上     * 原则:     * 1.每一行不允许有重复值     * 2.每一列不允许有重复值     * 3.数组元素分成3*3的9个区域,每个区域用1-9并且不重复的元素填充     * @param row 行     * @param col 列     * @param num 准备放置的数字     * */    public static boolean canBePlaced(int[][] data , int row , int col , int num){     boolean flag = true;     //1.每一行不允许有重复值     for(int i = 0 ; i < 9 ; i++){      if(data[i][col] == num){       flag = false;       return flag;      }     }     //2.每一列不允许有重复值     for(int i = 0 ; i < 9 ; i++){      if(data[row][i] == num){       flag = false;       return flag;      }     }     //3.区域元素不允许重复,相邻3*3个元素属于一个分区      //0 1 2 区域号 0   3 4 5区域号 1  6 7 8区域号 2     int area_row = (row / 3) * 3;     int area_col = (col / 3) * 3;     for(int i = area_row ; i < area_row + 3 ; i++){      for(int j = area_col ; j < area_col + 3; j++){       if(data[i][j] == num){        flag = false;        return flag;       }      }     }     return flag;    }    public static void print(int[][] data){     for(int i = 0 ; i < 9 ; i++){      for(int j = 0 ; j < 9 ; j++){       if(j == 8){        System.out.println(data[i][j]);       }else{        System.out.print(data[i][j] + " ");       }      }     }     System.out.println();    }}
0 0