如何提高该程序的效率?

sunjl250 2008-02-20 11:22:11
这个程序用的是递归算法,曾尝试化为非递归的,但是遇到两个问题:
1化不对(汗)
2效率反倒降低
是在没辙所以请大家帮忙。

问题如下:
m*n的棋盘,用黑色染k( [m,n]|k m,n的最小公倍能整除k)个格,每行黑色格数相同,每列黑色格数相同,问有多少种方案?

注释中的井指的是黑色格

测试数据如
5 10 20
输出:
共计56586600个结果

#include <stdio.h>
#include <time.h>
using namespace std;
unsigned long num;//方案计数
int hnum;//行
int lnum;//列
int jnum;//井
bool *field;//保存方案
int *h;//每行未安排的井数
int *l;//每列未安排的井数
int last;//不换行的时候记录上一次
void calc(int nl)//递归回溯
{
for(int i=last+1;i<lnum;i++)
if(l[i]>0)
{
field[nl*lnum+i]=true;
l[last=i]--;
if((--h[nl])>0)//如果该行还有未安排的井
{
calc(nl);
}else{
if(nl==hnum-1)//如果最后一行已经安排完
{
num++;//计数加一
}else{
last=-1;//从行首开始
calc(nl+1);//安排下一行
};
};
h[nl]++;//回溯
l[i]++;
field[nl*lnum+i]=false;
};
};
int main(int argc, char *argv[])
{
printf("请输入行数 列数 井数:");
scanf("%d %d %d",&hnum,&lnum,&jnum);
if((hnum<=0)||(lnum<=0)||(jnum<=0)||(jnum>hnum*lnum)||(jnum%hnum)||(jnum%lnum))
return 0;
field=new bool[hnum*lnum];
h=new int[hnum];
l=new int[lnum];
for(int i=0;i<hnum;i++)
{
h[i]=jnum/hnum;
for(int j=0;j<lnum;j++)
field[i*lnum+j]=false;
};
for(int i=0;i<lnum;i++)
l[i]=jnum/lnum;
last=-1;
num=0;
int i=clock();
calc(0);
printf("%d\n",clock()-i);
delete[] field;
delete[] h;
delete[] l;
printf("共计%d个结果\n",num);
scanf("%s",&hnum);
return 0;
};
...全文
101 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐鹦鹉 2008-02-21
  • 打赏
  • 举报
回复
递归多好啊,我喜欢递归。可以少些代码。速度么,现在的机器还在乎这点阿

64,652

社区成员

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

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