C++ 列举数值范围在1~9之间的三阶幻方

#include"iostream"
#include"string"
#include"vector"
#include"algorithm"
using namespace std ;



// 问题如下:
// 枚举 1~9 之间的幻方

class Solution{
                public :

                Solution()
                {
                             int a[3][3]={0};
                                vector<int> v;
                                v.reserve(10);
                                init(v);

                                // 枚举每一种方案
                                do{
                                                fun(a,v);
                                 }while(next_permutation(v.begin(),v.end()));
                                
                }
                void permu(vector<int> &v,int i)
                {
                                int temp;
                                temp=v[0];
                                v[0]=v[i];
                                v[i]=temp;
                }

                void init(vector<int> &v)
                {
                                for(int i=1;i<10;i++)
                                {
                                                v.push_back(i);
                                }
                }
                void printV(vector<int> &v)
                {
                                for(vector<int>::iterator it=v.begin();it<v.end();it++)
                                {
                                                cout<<*it<<'\t';
                                }
                                cout<<endl;
                }
                // 枚举出a[0][0] ,a[0][1],a[0][2] 
               void fun(int a[3][3],vector<int> v)
               {
                                for(int i=0;i<v.size();i++)
                                {
                                                for(int j=i+1;j<v.size();j++)
                                                {
                                                                for(int k=j+1;k<v.size();k++)
                                                                {
                                                                                if(v.at(i)+ v.at(j)+v.at(k)==15)
                                                                                {
                                                                                                a[0][0]=v.at(i);
                                                                                                a[0][1]=v.at(j);
                                                                                                a[0][2]=v.at(k);

                                                                                                vector<int>v2=v;
                                                                                                v2.erase(v2.begin()+k);
                                                                                                v2.erase(v2.begin()+j);
                                                                                               v2.erase(v2.begin()+i);
                                                                                                 // 枚举出a[1][0] ,a[2][0]
                                                                                               fun2(a,v2);
                                                                                }
                                                                }
                                                }
                                }

               }
                // 枚举出a[1][0] ,a[2][0]
               void fun2(int a[3][3],vector<int> v)
               {
                                for(int i=0;i<v.size();i++)
                                {
                                                for(int j=i+1;j<v.size();j++)
                                                {
                                                                if(a[0][0]+v.at(i)+v.at(j)==15)
                                                                {
                                                                                a[1][0]=v.at(i);
                                                                                a[2][0]=v.at(j);
                                                                                vector<int> v2=v;
                                                                                v2.erase(v2.begin()+j);
                                                                                v2.erase(v2.begin()+i);
                                                                                // printV(v2);
                                                                                 // 枚举出a[1][1] ,a[2][2]
                                                                                fun3(a,v2);
                                                                }
                                                }
                                }
               }
               // 枚举出a[1][1] ,a[2][2]
               void fun3(int a[3][3],vector<int> v)
               {
                                for(int i=0;i<v.size();i++)
                                {
                                                for(int j=i+1;j<v.size();j++)
                                                {
                                                                if(a[0][0]+v.at(i)+v.at(j)==15)
                                                                {
                                                                                a[1][1]=v.at(i);
                                                                                a[2][2]=v.at(j);
                                                                                vector<int> v2=v;
                                                                                v2.erase(v2.begin()+j);
                                                                                v2.erase(v2.begin()+i);
                         
                                                                                // 枚举出a[1][2] 
                                                                                fun4(a,v2);
                                                                }
                                                }
                                }
               }

                 void fun4(int a[3][3],vector<int> v)
               {
                               for(int i=0;i<v.size();i++)
                               {
                                                if(a[0][2]+a[2][2]+v.at(i)==15)
                                                {
                                                                vector<int>v2=v;
                                                                a[1][2]=v.at(i);
                                                                v2.erase(v2.begin()+i);
                                                                // 枚举出a[2][1] 
                                                                fun5(a,v2);
                                                }
                               }
                               
                               
               }

                 void fun5(int a[3][3],vector<int> v)
               {
                               for(int i=0;i<v.size();i++)
                               {
                                                if(a[2][0]+a[2][2]+v.at(i)==15)
                                                {
                                                                a[2][1]=v.at(i);
                                                                // 输出幻方
                                                                printMatrix(a);
                                                                cout<<endl;
                                                }
                               }
                               
                               
               }
              
               void printMatrix(int a[3][3])
               {
                                for(int i=0;i<3;i++)
                                {
                                                for(int j=0;j<3;j++)
                                                {
                                                                cout<<a[i][j]<<'\t';
                                                }
                                                cout<<endl;
                                }
               }
};
int main()
{
                Solution slt;

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值