zju 1457 prime ring

neptunez 2003-02-13 12:44:12
请问都有什么算法阿,。。
要求时间30秒。。。回溯是肯定不行了,我都已经优化的不能再优化了。。

http://acm.zju.edu.cn/show_problem.php?pid=1457
...全文
88 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
LeeMaRS 2003-02-13
  • 打赏
  • 举报
回复
就是回溯,注意排除无解的情况,不要做无谓的搜索
mmmcd 2003-02-13
  • 打赏
  • 举报
回复
就是回溯
#define true 1
#define false 0
#include <iostream.h>
short can[21][21];//我这个tc++竟没有bool类型
short in[21];
short result[20];
short N;
short is_prime(int n)
{
int i;
for(i=2;i<n;i++)
if(n%i==0)return false;
return true;
}

void initial()
{
int i,j;
for(i=1;i<21;i++)
{
for(j=i;j<21;j++)
{
can[j][i]=can[i][j]=is_prime(i+j);
}
}
}

void output()
{
int i=0;
for(;i<N-1;i++)
cout<<result[i]<<' ';
cout<<result[i]<<endl;
}

void go(int k)
{
int i;
if(k==N)
{
if(can[result[0]][result[N-1]])
output();
return;
}
for(i=result[k-1]%2+1;i<=N;i+=2)
{
if(in[i])
continue;
if(can[result[k-1]][i])
{
result[k]=i;
in[i]=true;
go(k+1);
in[i]=false;
}
}
}

int main()
{
int n=0;
int i;
initial();
in[1]=true;
result[0]=1;
for(;cin>>N;)
{
cout<<"Case "<<++n<<":\n";
for(i=2;i<=N;i++)
in[i]=false;
if(N%2==0)
go(1);
cout<<endl;
}
return 0;
}
nhzp 2003-02-13
  • 打赏
  • 举报
回复
就是一般的回溯啊,很快的
neptunez 2003-02-13
  • 打赏
  • 举报
回复
不会吧。。为什么只要0.58秒就过了这次,上次30秒都没有过。。

我是没有考虑奇数直接不用算。难道test data里面很多奇数?
neptunez 2003-02-13
  • 打赏
  • 举报
回复
for(i=result[k-1]%2+1;i<=N;i+=2)

这里我用的全搜索。。

你的速度也很慢呀,,
是20的时候也要上到分钟的。。

难道通过了?
neptunez 2003-02-13
  • 打赏
  • 举报
回复
什么意思啊,,

我是回溯做的。。也没觉得哪里无谓搜索了。。n=20的时候要几分钟的时间。。

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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