数独的算法
数独规则介绍
0. 准备工作
typedef std::vector<int> vint;//头文件vector
typedef std::vector<vint> vvint;//二维数组
class Numbertable
{
public:
explicit Numbertable();
private:
vvint vvnum;
}1.生成
void Numbertable::change_value(int lhs,int rhs) { for(vint & vec : vvnum)//c++11,基于范围的for循环 for(int &a : vec) { a = a==lhs ? rhs : ( a==rhs? lhs : a ); } }std::default_random_engine e(time(0));//c++11,头文件random std::uniform_int_distribution<int> u(1,9);//c++11,随机数生成 for(int a=0;a<15;++a)//15可以该为其它数字 { int i=u(e),j=u(e);//两个1-9之间的随机数 if(i!=j) change_value(u(e),u(e)); else --a; }void Numbertable::swap_row(int lhs,int rhs) { using std::swap; swap(vvnum[lhs],vvnum[rhs]); } void Numbertable::swap_col(int lhs,int rhs) { for(int i=0;i<9;++i) { using std::swap; swap(vvnum[i][lhs],vvnum[i][rhs]); } }std::default_random_engine e(time(0));//c++11,头文件random std::uniform_int_distribution<int>ul(0,2); for(int a=0;a<10;++a )//10可以该为其它数字 { int bases=3*ul(e),i=bases+ul(e),j=bases+ul(e); if(i!=j) swap_row(i,j);//i与j均在 0-2 3-5 6-8 三个范围中的一个里 bases=3*ul(e),i=bases+ul(e),j=bases+ul(e); if(i!=j) swap_col(i,j);//i与j均在 0-2 3-5 6-8 三个范围中的一个里 }void Numbertable::swap_threecol(int lhs,int rhs) { for(int i=0;i<3;++i) swap_col(lhs+i,rhs+i); } void Numbertable::swap_col(int lhs,int rhs) { for(int i=0;i<9;++i) { using std::swap; swap(vvnum[i][lhs],vvnum[i][rhs]); } }std::default_random_engine e(time(0));//c++11,头文件random std::uniform_int_distribution<int>ul(0,2); for(int a=0;a<10;++a)//10可以该为其它数字 { i=ul(e),j=ul(e); if(i!=j) swap_threerow(3*i,3*j);//0 3 6 i=ul(e),j=ul(e); if(i!=j) swap_threecol(3*i,3*j);// 0 3 6 }void Numbertable::change_Number() { std::default_random_engine e(time(0));//c++11,头文件random std::uniform_int_distribution<int> u(1,9); //swap value for(int a=0;a<15;++a)//15可以该为其它数字 { int i=u(e),j=u(e); if(i!=j) change_value(u(e),u(e)); else --a; } std::uniform_int_distribution<int>ul(0,2); //swap row and column for(int a=0;a<10;++a)//10可以该为其它数字 { //开始玩魔方,玩魔方的行列顺序可以随意更改 int bases=3*ul(e),i=bases+ul(e),j=bases+ul(e); if(i!=j) swap_row(i,j);// 0-2 3-5 6-8 bases=3*ul(e),i=bases+ul(e),j=bases+ul(e); if(i!=j) swap_col(i,j);//0-2 3-5 6-8 i=ul(e),j=ul(e); if(i!=j) swap_threerow(3*i,3*j);//0 3 6 i=ul(e),j=ul(e); if(i!=j) swap_threecol(3*i,3*j);// 0 3 6 }Numbertable::Numbertable():vvnum({ {1,2,3,4,5,6,7,8,9}, {4,5,6,7,8,9,1,2,3}, {7,8,9,1,2,3,4,5,6}, {2,3,4,5,6,7,8,9,1}, {5,6,7,8,9,1,2,3,4}, {8,9,1,2,3,4,5,6,7}, {3,4,5,6,7,8,9,1,2}, {6,7,8,9,1,2,3,4,5}, {9,1,2,3,4,5,6,7,8}}) { change_Number(); }
2.矩阵的显示和难度
Last updated