华为机试---数独
来源:互联网 发布:网络营销策划书 编辑:程序博客网 时间: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 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
- 华为机试---数独
- 【华为】数独
- 华为,数独
- 华为Oj----Sudoku(数独)
- 牛客网---2016---华为数独
- 华为编程大赛中的“数独”问题
- 华为OJ(数独游戏-Sudoku)
- 面试题-华为(16年)-数独-7
- 华为2016研发工程师编程题3数独
- 华为机试--删数
- 华为机试---删数
- 数独
- 数独
- 数独
- 数独
- 数独
- 数独
- 数独
- 矩形裁剪算法_pyopengl版本1
- android之HttpURLConnection 字段解析
- 【算法学习】horspool查找匹配字符串
- apache2中没有apxs
- TCP自时钟/拥塞控制/带宽利用之脉络半景解析
- 华为机试---数独
- 设置不要缓存cookie
- CFRunLoop
- Longest Increasing Subsequence
- 原来我真的不会用seajs
- 数字梯形问题(最小费用流)
- SSH开发问题-修改页面校验失败后返回原来页面(非OGNL)
- nyoj832 记忆化搜索dp
- 最短路径—Dijkstra算法和Floyd算法