您的位置:首页 > 职场人生

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

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

问题描述

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

参考代码

#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
.first,y=blank
.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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  华为 面试题