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

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;
}
...全文
144 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
justioo 2005-03-21
  • 打赏
  • 举报
回复
好多页?
QunKangLi 2005-03-21
  • 打赏
  • 举报
回复
谭浩强的C程序设计上有个例子,复杂度为O(n).
llmsn 2005-03-20
  • 打赏
  • 举报
回复
不是发了一个这样的帖了吗?
justioo 2005-03-20
  • 打赏
  • 举报
回复
ding

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧