码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode:Sudoku Solver

时间:2017-04-28 14:05:11      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:uniq   个数   empty   push   write   img   dia   修改   alt   

先看题:

Write a program to solve a Sudoku puzzle by filling the empty cells.

Empty cells are indicated by the character ‘.‘.

You may assume that there will be only one unique solution.

技术分享技术分享

第一道逼我用vs调试的的题;心好累。。。

解这道题我首先维护一个9*9*9的矩阵,代表第i,j个位置可不可以放置k这个数字,初始化为0,代表可以放入,然后读入原始数独数据,开始维护这个矩阵,从(0,0)处开始递归了。

下面附上代码:

class Solution {
public:
	vector<vector<char>> chess;
	vector<vector<vector<char> > > che;//如果是0则可以填入,否则不可以填
	bool solve(int m,int n){
		bool flag=false;
		if(chess[m][n]!=‘.‘){//该位置已经有数字的时候
			while(chess[m][n]!=‘.‘){//跳过所有数字
				if(n<8)n++;
				else if(n==8&&m==8){
					return true;
				}
				else{
					n=0;
					m++;
				}
			}
			flag=solve(m,n);
			return flag;
		}
		else{
			for(int i=0;i<9&&!flag;++i){//从1开始试
				if(!che[m][n][i]){//如果是0的话可以填入
				    int mm=m,nn=n; //用于记录当前位置
					chess[m][n]=i+‘1‘;
					for(int k=0;k<9;++k)//填入一个数字后修改che矩阵,+1
					    che[m][k][i]+=1;
					for(int k=0;k<9;++k)
					    che[k][n][i]+=1;
					int mmm=m/3*3,nnn=n/3*3;
					for(int k=0;k<3;++k){
						for(int z=0;z<3;++z){
							che[mmm+k][nnn+z][i]+=1;
						}
					}
					if(nn<8){
						nn++;
						flag=solve(m,nn);
					}
					else if(n==8&&m==8){
						return true;
					}
					else{
						nn=0;
						mm++;
						flag=solve(mm,nn);
					}
					if(!flag){
					
					    chess[m][n]=‘.‘;//该数字不行的话修改che矩阵,-1
					    for(int k=0;k<9;++k)
					        che[m][k][i]-=1;
				    	for(int k=0;k<9;++k)
				    	    che[k][n][i]-=1;
				    	int mmm=m/3*3,nnn=n/3*3;
				    	for(int k=0;k<3;++k){
				    		for(int z=0;z<3;++z){
				    			che[mmm+k][nnn+z][i]-=1;
				    		}
				    	}
					}
					else{
					    return true;
					}
				}
			}
		}
		return false;     
	}
	void solveSudoku(vector<vector<char>>& board) {
		chess=board;
		for(int i=0;i<9;++i){
		    vector<vector<char>> temp1;
		    for(int i=0;i<9;++i){
		        vector<char> temp(9,0);
		        temp1.push_back(temp);
		    }
		    che.push_back(temp1);
		}
		for(int i=0;i<9;++i){//读入原始数独数组
			for(int j=0;j<9;++j){
				if(chess[i][j]==‘.‘)continue;
				else{                   //如果chess[i][j]是数字
					for(int k=0;k<9;++k)
						che[i][k][chess[i][j]-‘1‘]+=1;//所在行每一个位置的che+1
					for(int k=0;k<9;++k)
						che[k][j][chess[i][j]-‘1‘]+=1;//所在列每一个位置的che+1
					int mmm=i/3*3,nnn=j/3*3;
					for(int k=0;k<3;++k){
						for(int z=0;z<3;++z){
							che[mmm+k][nnn+z][chess[i][j]-‘1‘]+=1;//所在小方框每一个位置的che+1
						}
					}
				}
			}
		}
		bool flag;
		flag=solve(0,0);
		board=chess;
	}
};

  

leetcode:Sudoku Solver

标签:uniq   个数   empty   push   write   img   dia   修改   alt   

原文地址:http://www.cnblogs.com/jhmu0613/p/6780770.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!