[2016/11/25]九宫格问题

题目大意

数独规则点这里
注意可以有格子是空的。空的格子用“.”表示。

方法一.位运算

知道了这个之后,就很好办啦。因为数字只有九个,而且不允许重复出现。直接想到位运算!表示当前数字,只需要把1向右移动当前数字位。然后设置一个状态变量,存储当前有多少数字出现过。把他们相与,如果为0说明此数字还没出现过,就更新这个状态变量,即把他们做或运算。
计算3*3格子的时候参考了别人的代码,想法很巧妙,直接两重循环搞定。

bool isValidSudoku(char** board, int boardRowSize, int boardColSize) {
    int i,j,k;
    int block, column, row, num,flag;
    for(i = 0; i<9; i++){
        column = 0;
        row = 0;
          block = 0;
        for(j = 0; j<9; j++){
            if(board[i][j] != '.'){
                num = board[i][j] - '0';
                flag = 1 << num;
                if((row & flag) == 0)
                    row |= flag;
                else
                    return false;
            }
            if(board[j][i] != '.'){
                num = board[j][i] - '0';
                flag = 1 << num;
                if((column & flag) == 0)
                    column |= flag;
                else
                    return false;
            }

            int x = i / 3 * 3 + j / 3;
            int y = i % 3 * 3 + j % 3;
            if(board[x][y]!='.'){
                num = board[x][y] - '0';
                flag = 1 << num;
                if((block & flag) == 0)
                    block |= flag;
                else
                    return false;
            }
        }
    }
    return true;
}
方法二.STL-set

看下面有人用set,把代码粘了过来。复习下set的用法。

class Solution {
 public:
  bool check(set<char>& dc, char x) {
    if (dc.count(x)) return false;
    if (x != '.') dc.insert(x);
    return true;
  }

  bool isValidSudoku(vector<vector<char>>& board) {
    // each col / row
    for (int i = 0; i < 9; i++) {
      set<char> dc1, dc2;
      for (int j = 0; j < 9; j++) {
        if (!check(dc1, board[i][j])) return false;
        if (!check(dc2, board[j][i])) return false;
      }
    }

    // each block
    for (int i = 0; i < 3; i++)
      for (int j = 0; j < 3; j++) {
        set<char> dc;
        for (int k = 0; k < 3; k++)
          for (int m = 0; m < 3; m++)
            if (!check(dc, board[3 * i + k][3 * j + m])) return false;
      }

    return true;
  }
};
    原文作者:九宫格问题
    原文地址: https://blog.csdn.net/ZZU_Ringo/article/details/53336911
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞