面试题-华为(16年)-数独-7

来源:互联网 发布:保健品网络推广策划 编辑:程序博客网 时间:2024/06/05 02:09

这是从牛客网上扒下来的面试题,题目有点难,我没有做出来,下面的答案是从参考答案里扒下来的,等以后有时间再慢慢看(希望以后会有时间,哈哈)。

问题描述

数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。

参考代码

#include <iostream>#include <vector>#include <fstream>using namespace std;void print_sudoku(vector<vector<int> > &matrix){    ofstream fout("text.txt",ofstream::app);    for(int i=0;i<9;++i){        for(int j= 0;j<9;++j){            fout<<matrix[i][j];            if(j!=8)                fout<<" ";        }        fout<<endl;    }    fout<<"***************************"<<endl;}void fill_sudoku(vector<vector<int> > &matrix,vector<pair<int,int> > &blank,int n){    if(n==blank.size()){        print_sudoku(matrix);//print all the possibilities        return;    }    vector<bool> flags(9,false);    int x=blank[n].first,y=blank[n].second;    for(int i=0;i<9;++i){//row and column renouncement        if(matrix[x][i]!=0)            flags[matrix[x][i]-1]=true;        if(matrix[i][y]!=0)            flags[matrix[i][y]-1]=true;    }    int a[9][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1},{0,0}};    int m=x/3,k=y/3;    m=m*3+1;k=k*3+1;    for(int i=0;i<9;++i){//square renouncement        int temp=matrix[m+a[i][0]][k+a[i][1]];        if(temp!=0)            flags[temp-1]=true;    }    for(int i=1;i<=9;++i){        if(!flags[i-1]){            matrix[x][y]=i;//test each of the candidates            fill_sudoku(matrix,blank,n+1);//iteration            matrix[x][y]=0;        }    }}int main(){    vector<vector<int> > matrix(9,vector<int>(9));    vector<pair<int,int> > blank;    for(int i=0;i<9;++i)        for(int j=0;j<9;++j){            cin>>matrix[i][j];            if(matrix[i][j]==0)                blank.push_back(make_pair(i,j));        }    fill_sudoku(matrix,blank,0);    return 0;}
0 0