帮帮忙哈?我的算法有问题,帮忙改一下,先谢谢了
# include<iostream>
# include<vector>
# include<algorithm>
# include<numeric>
# include<conio.h>
# include<cmath>
using namespace std;
//--------------
void pfi(int a);
vector<int> create_vec(const int size);
bool condition(vector<int> &vec);
void print(vector<int> &vec);
/*把1到n*n的数字填到n*n的方格中,使得横向相加,纵向相加,对角线相加,各和相等
这里用的是穷举法,不好,超级烧cpu,一个5*5的方格,比破25位数的密码还难,很不好
*/
//--------------
void pfi(int a)
{
cout<<a<<ends;
}
vector<int> create_vec(const int size)
{
vector<int> cre_vec;
for(int i=1;i<=size*size;i++)
cre_vec.push_back(i);
return cre_vec;
}
bool condition(vector<int> &vec)
{
int size=sqrt(vec.size());
int sum=0;
for(int ii=1;ii<=size*size;ii++)
sum+=ii;
sum/=size;
for(int i=0;i<size;i++)
{
if( accumulate(vec.begin()+size*i,vec.begin()+size*(i+1),0 )!=sum)
return 0;
}
//对角线1
int sum_catercorner=0;
for(int j=0;j<size;j++)
{
sum_catercorner+=vec[j*(size+1)];
}
if((sum_catercorner)!=sum)
return 0;
//纵向
for(int erect=0;erect<size;erect++)
{
int sum_erect=0;
for(int k=0;k<size;k++)
{
sum_erect+=vec[erect+k*size];
}
if((sum_erect)!=sum)
return 0;
}
//对角线2/
int sum_catercorner2=0;
for(int m=0;m<size;m++)
{
sum_catercorner2+=vec[(m+1)*(size-1)];
}
if((sum_catercorner2)!=sum)
return 0;
return 1;
}
void print(vector<int> &vec)
{
int size=sqrt(vec.size());
for(int i=0;i<size;i++)
{
for_each(vec.begin()+i*size,vec.begin()+(i+1)*size,pfi);
cout<<endl;
}
}
main()
{
cout<<"把1到n*n的数字填到n*n (n为奇数) 的方格中,使得横向相加,纵向相加,对角线相加,各和相等\
\n这里用的是 穷举法,不好,超级烧cpu,\n一个5*5的方格,比破25位数的密码还难,很不好\
\n可以试试 n 取 3\n zhouyinhui 03.2005"<<endl;
cout<<"input the n: ";
int size;
cin>>size;
if(size%2==0)
{
cout<<"没有答案的\a\n\n"<<endl;
getch();
return 0;
}
vector<int> vec(create_vec(size));
int res_count=0;
sort(vec.begin(),vec.end());
if(condition(vec)==1)
{
print(vec);
res_count++;
}
cout<<endl<<endl;
while(next_permutation(vec.begin(),vec.end()) )
{
if(condition(vec))
{
print(vec);
res_count++;
cout<<endl<<endl;
}
}
if(res_count==0)
cout<<"没有答案的\a\n\n"<<endl;
else
cout<<"共 "<<res_count<<"个答案"<<endl<<endl;
getch();
return 0;
}