• [leetcode]Valid Sudoku


    简单题。先把横的竖的扫一下,然后按照每个3*3的小格扫一遍。

    import java.util.HashSet;
    
    public class Solution {
        public boolean isValidSudoku(char[][] board) {
            // Start typing your Java solution below
            // DO NOT write main() function
            if (board.length == 0) return false;
            if (board.length % 3 != 0) return false;
            if (board[0].length != board.length) return false;
            // check length of each row
            for (int i = 0; i < board.length; i++) {
                for (int j = 1; j < board[0].length; j++) {
            		if (board[j].length != board[0].length) return false;
            	}
            }
            
            int len = board.length;
            for (int i = 0; i < len; i++) {
            	HashSet<Character> set1 = new HashSet<Character>();
            	HashSet<Character> set2 = new HashSet<Character>();
            	for (int j = 0; j < len; j++) {
            		char c1 = board[i][j];
            		if (c1 == '.') {}
            		else if (c1 >= '1' && c1 <= '9') {
            			if (set1.contains(c1)) {
            				return false;
            			}
            			set1.add(c1);
            		}
            		else { return false; }
            		char c2 = board[j][i];
            		if (c2 == '.') {}
            		else if (c2 >= '1' && c2 <= '9') {
            			if (set2.contains(c2)) {
            				return false;
            			}
            			set2.add(c2);
            		}
            		else { return false; }
            	}
            }
            
            int len_3 = len / 3;
            
            for (int i = 0; i < len_3; i++) {
            	for (int j = 0; j < len_3; j++) {
            		HashSet<Character> set = new HashSet<Character>();
            		for (int x = 0; x < 3; x++) {
            			for (int y = 0; y < 3; y++) {
            				
            				char c = board[i*3+x][j*3+y];
                    		if (c == '.') {}
                    		else if (c >= '1' && c <= '9') {
                    			if (set.contains(c)) {
                    				return false;
                    			}
                    			set.add(c);
                    		}
                    		else { return false; }
            			}
            		}
            	}
            }
            return true;
        }
    }
    

    看了一下参考,其实一边扫描就可以了。任何一个格子扫完都能把三个判断条件同时往前推进。参考:http://discuss.leetcode.com/questions/215/valid-sudoku

    class Solution {
    public:
        bool isValidSudoku(vector<vector<char> > &board) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            vector<vector<bool> > rows(9, vector<bool>(9, false));
            vector<vector<bool> > cols(9, vector<bool>(9, false));
            vector<vector<bool> > blocks(9, vector<bool>(9, false));
    
            for (int i = 0; i < 9; ++i) {
                for (int j = 0; j < 9; ++j) {
                    if (board[i][j] == '.') continue;
                    int c = board[i][j] - '1';
                    if (rows[i][c] || cols[j][c] || blocks[i - i % 3 + j / 3][c])
                        return false;
                    rows[i][c] = cols[j][c] = blocks[i - i % 3 + j / 3][c] = true;
                }
            }
            return true;
        }
    };
    

    第二刷:

    Annie的做法也是只扫一遍,而且用了bit来存,省空间。

  • 相关阅读:
    [图论训练]1143: [CTSC2008]祭祀river 二分图匹配
    [图论训练]BZOJ 2118: 墨墨的等式 【最短路】
    HDU 5402 : Travelling Salesman Problem
    [图论训练]BZOJ 3245: 最快路线【最短路】
    BZOJ 1724: [Usaco2006 Nov]Fence Repair 切割木板
    Android 全屏方法
    【转载】差分约束
    BZOJ 1688: [Usaco2005 Open]Disease Manangement 疾病管理
    Pain for friend
    BZOJ 1739: [Usaco2005 mar]Space Elevator 太空电梯
  • 原文地址:https://www.cnblogs.com/lautsie/p/3236434.html
Copyright © 2020-2023  润新知