Valid Sudoku

来源:互联网 发布:数据存储方式 编辑:程序博客网 时间:2024/04/28 14:29

Valid Sudoku

 Total Accepted: 4240 Total Submissions: 15658My Submissions

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.

The Sudoku board could be partially filled, where empty cells are filled with the character '.'.


A partially filled sudoku which is valid.

Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

struct node {    int i;    int j;    int key;    node *next;    node(int a,int b)        :i(a),j(b),next(NULL){}};class Solution {public:    bool valCore(node *p,int m[10][10][3]){        if (!p) return true;        int len = 10;        int row=p->i,colum=p->j;        int i0 = row;        int i1=colum;        int i2=row/3*3+colum/3+1;        for (int i=1; i<len; ++i){            if (m[i0][i][0]!=0 || m[i1][i][1]!=0                 || m[i2][i][2]!=0)                 continue;            m[i0][i][0] = i;            m[i1][i][1] = i;             m[i2][i][2] = i;            p->key = i;            if (valCore(p->next,m)) return true;            m[i0][i][0] = 0;            m[i1][i][1] = 0;             m[i2][i][2] = 0;        }        return false;    }    void solveSudoku(vector<vector<char> > &b) {         int mapSu[10][10][3];        memset(mapSu,0,sizeof(mapSu));        int len = 9;        node *head=NULL,*tail=NULL,*p;        for (int i=0; i<len; ++i) {            for (int j=0; j<len; ++j) {                if (b[i][j]=='.') {                    p = new node(i,j);                    if (tail){                        tail->next=p;                        tail = p;                    } else {                        head = tail = p;                    }                    continue ;                }                int num = b[i][j]-'0';                if (mapSu[i][num][0]!=0 || mapSu[j][num][1]!=0                     || mapSu[i/3*3+j/3+1][num][2]!=0)                     return ;                mapSu[i][num][0] = num;                mapSu[j][num][1] = num;                mapSu[i/3*3+j/3+1][num][2] = num;            }        }        if (valCore(head,mapSu)){            tail = head;            while (tail) {                b[tail->i][tail->j] = tail->key+'0';                tail = tail->next;            }        }                while (head){            tail = head;            while (tail->next && tail->next->next){                tail = tail->next;            }            if (tail->next) {                delete tail->next;                tail->next=NULL;            } else {                delete tail;                head = NULL;                tail = NULL;            }                    }        //return true;        //    }};

0 0
原创粉丝点击