穷举方程数独算法(20分)
题目内容:如下
逻辑要点一共有三个:
1.满足等式;
2.数独;
3.尽可能缩小暴力穷举范围
代码量:
有点大。
代码如下:
#include <iostream>
using namespace std;
int main()
{
int ei;
cout<<"请输入要查询的等式编号ei(ei>=1):";
cin>>ei;
/**********Program**********/
int i,j,k;
int b[10]={0},c[3];
int i0,j0;
int flag=0;
int sum=0;
for(i=102;i<=493;i++)//第一个数的范围取第三个数最大值的一半(取小)
{
for(j=i+1;j<=987;j++)//和第三个数k的范围保持一致
//第三个数k(也就是和)最大为987(数独)
{
k=i+j;
if(k>987)break;//爆表直接打破循环
int a[3]={i,j,k};//初筛通过,则存好三个数,便于后面非常妙地判断数独
for(i0=0;i0<3;i0++)
do
{
b[a[i0]%10]=1;
a[i0]/=10;
}while(a[i0]!=0);
//把三个数的各位数逐一检索,一经发现使用,赋1,存到c数组里面
for(j0=0;j0<10;j0++)
{
sum+=b[j0];
b[j0]=0;
}
if(sum==9)//sum为9,说明九个不同的数填了九个坑
{
flag++;//标记自增,记录位置
if(flag==ei)
{
c[0]=i;
c[1]=j;
c[2]=k;
}//如果位置正好是目标,存起来,便于输出
}
sum=0;
}
}
if(ei>flag)
{
cout<<"一共可生成"<<flag<<"个满足条件的等式"<<endl;
cout<<"第"<<ei<<"个等式不存在"<<endl;
}
else
{
cout<<"一共可生成"<<flag<<"个满足条件的等式"<<endl;
cout<<"第"<<ei<<"个等式"<<c[0]<<"+"<<c[1]<<"="<<c[2]<<endl;
}
/********** End **********/
return 0;
}
输入样例:
- 56
- 7
- 9
- 123
- 1
- 554
- 2
- 3
- 200
- 17
- 790
- 345
- 555
- 29
- 90
- 11
- 400
- 240
- 123
- 106
输出样例:
一共可生成544个满足条件的等式
第56个等式109+754=863
一共可生成544个满足条件的等式
第7个等式104+579=683
一共可生成544个满足条件的等式
第9个等式105+269=374
一共可生成544个满足条件的等式
第123个等式142+695=837
一共可生成544个满足条件的等式
第1个等式103+469=572
一共可生成544个满足条件的等式
第554个等式不存在
一共可生成544个满足条件的等式
第2个等式103+479=582
一共可生成544个满足条件的等式
第3个等式103+579=682
一共可生成544个满足条件的等式
第200个等式169+403=572
一共可生成544个满足条件的等式
第17个等式106+487=593
一共可生成544个满足条件的等式
第790个等式不存在
一共可生成544个满足条件的等式
第345个等式249+358=607
一共可生成544个满足条件的等式
第555个等式不存在
一共可生成544个满足条件的等式
第29个等式108+359=467
一共可生成544个满足条件的等式
第90个等式129+735=864
一共可生成544个满足条件的等式
第11个等式105+387=492
一共可生成544个满足条件的等式
第400个等式284+391=675
一共可生成544个满足条件的等式
第240个等式183+526=709
一共可生成544个满足条件的等式
第123个等式142+695=837
一共可生成544个满足条件的等式
第106个等式137+268=405