帮帮忙哈?我的算法有问题,帮忙改一下,先谢谢了

justioo 2005-03-20 12:32:49
# 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;
}
...全文
105 点赞 收藏 4
写回复
4 条回复
justioo 2005年03月21日
好多页?
回复 点赞
QunKangLi 2005年03月21日
谭浩强的C程序设计上有个例子,复杂度为O(n).
回复 点赞
llmsn 2005年03月20日
不是发了一个这样的帖了吗?
回复 点赞
justioo 2005年03月20日
ding
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告