博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数独是否合法
阅读量:5242 次
发布时间:2019-06-14

本文共 2219 字,大约阅读时间需要 7 分钟。

http://www.lintcode.com/en/problem/valid-sudoku/

注意点: 整块中按列选取子块,子块里按列遍历,对应的角标应该如何设置,考虑清楚。

    i = 0- 9, i /3 = 0,0,0,1,1,1......

          i%3 = 0,1,2,0,1,2....... 

   [k/3,k%3] 表示子块按列填充;[j,i]表示在整块中子块是按行选取的!

    set的巧妙使用,保证不重复

1 public boolean isValidSudoku(char[][] board) { 2     boolean[] test = new boolean[9]; 3     for(int i = 0; i < 9; i++) {  //列遍历 4         Arrays.fill(test, false); 5         for(int j = 0; j < 9; j++) { 6             if(!visited(test, board[j][i])) return false; 7         } 8     } 9     for(int i = 0; i < 9; i++) {  //行遍历10         Arrays.fill(test, false);11         for(int j = 0; j < 9; j++) {12             if(!visited(test, board[i][j])) return false;13         }14     }15     for(int i = 0; i < 9; i += 3){16         for(int j = 0; j < 9; j += 3) {17             Arrays.fill(test, false);18             for(int k = 0; k < 9; k++) { //[k/3,k%3] 表示子块按列填充;[j,i]表示在整块中子块是按列选取的,19                                          //一列中选完子块再从第二列开始选子块  20                 if(!visited(test,board[j+ k / 3][i + k % 3])) return false;21             }22         }    23     }24     return true;25   /*1 4 726     2 5 827     3 6 9 */28 }29 //visited,表示是否访问过,一旦被调用,return true 表示访问过且符合要求,false表示不符合要求,不是数独。 30 private boolean visited(boolean[] process, char ch) {31     if(ch == '.') return true;32     int m = ch - '0';33     if(process[m - 1] || m > 9 || m < 1) return false;   //如果第m-1个位置已经被放过元素,说明有重复元素加进来,return false34     process[m - 1] = true;  // 数字 8就放在数组的第八个位置。35     return true;36 }
View Code
1 public boolean isValidSudoku(char[][] board) { 2     Set
set = new HashSet
(); 3 for(int i = 0; i < 9 ; i++) { 4 for(int j = 0; j < 9; j++) { 5 char ch = board[i][j]; 6 //每从矩阵中取一个char,都要在set中放三次,分别是char在第几行,第几列,第几子块 7 //如果一个字符不能放三次,set由于要保证数据不重复,所以说明之前肯定放过,也即字符发生了重复。 8 if(ch != '.') { 9 if(!set.add(ch + "in row" + i) || !set.add(ch + "in col" + j) || !set.add(ch + "in block" + i/3 +'-' + j/3)) {10 return false;11 }12 }13 }14 }15 return true;16 }
View Code

 

转载于:https://www.cnblogs.com/ddcckkk/p/6826171.html

你可能感兴趣的文章
RabbitMQ、Redis、Memcache、SQLAlchemy
查看>>
03 线程池
查看>>
手机验证码执行流程
查看>>
设计模式课程 设计模式精讲 2-2 UML类图讲解
查看>>
Silverlight 的菜单控件。(不是 Toolkit的)
查看>>
jquery的contains方法
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
桥接模式-Bridge(Java实现)
查看>>
303. Range Sum Query - Immutable
查看>>
【★】浅谈计算机与随机数
查看>>
Leetcode 226: Invert Binary Tree
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
前台freemark获取后台的值
查看>>
Leetcode: Unique Binary Search Trees II
查看>>
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>
Django 相关
查看>>
git init
查看>>