leetcode第一刷_Valid Sudoku

143 篇文章 0 订阅

一开始没看清题,以为让当场求数独呢,吓得一直没敢做。后来发现这个题原来如此之简单,只要判断现在棋盘上的数字满不满足情况要求就可以了。

这不就是三次循环吗。。看看每一行满不满足,每一列满不满足,每个小的3*3的格子满不满足就行了。每个小3*3格子我是用求得左上角的方法来验证的。

其实觉得数独难还有一个原因是记得他在编程之美上出现过。。那上面讨论的主要是怎样构造一个数独,具体记不太清楚了,印象最深的是,要想保证有解,最好的办法是先用置换法生成一个解,然后去掉这个解中的一些位置。

class Solution {
public:
    bool isValidSudoku(vector<vector<char> > &board) {
        bool vis[10];
        for(int start=0;start<9;start++){
            int i = start/3, j = start%3;
            memset(vis, 0, sizeof(vis));
            for(int k=0;k<9;k++){
                int ii=i*3+k/3, jj=j*3+k%3;
                if(board[ii][jj] == '.')
                    continue;
                if(vis[board[ii][jj]-'0'])
                    return false;
                else
                    vis[board[ii][jj]-'0'] = 1;
            }
        }
        for(int i=0;i<9;i++){
            memset(vis, 0, sizeof(vis));
            for(int j=0;j<9;j++){
                if(board[i][j]=='.')
                    continue;
                if(vis[board[i][j]-'0'])
                    return false;
                vis[board[i][j]-'0'] = 1;
            }
        }
        for(int i=0;i<9;i++){
            memset(vis, 0, sizeof(vis));
            for(int j=0;j<9;j++){
                if(board[j][i]=='.')
                    continue;
                if(vis[board[j][i]-'0'])
                    return false;
                vis[board[j][i]-'0'] = 1;
            }
        }
        return true;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值