您的位置:首页 > 其它

ACM 66. [HAOI2004模拟] 数列问题(水dfs)

2014-08-17 08:56 302 查看


66. [HAOI2004模拟] 数列问题

★☆ 输入文件:
dfs3.in
输出文件:
dfs3.out
简单对比

时间限制:1 s 内存限制:128 MB

问题描述

试编程将 1 至 N ( N ≤ 15 )的自然数序列 1 , 2 , … , N 重新排列,使任意相邻两数之和为素数。例如 N=3 时有两种排列方案 123 、 321 满足要求。
【输入格式】
输入文件:dfs3.in
第一行:一个整数n(1<=n<=15)
【输出格式】
输出文件:dfs3.out
输出若干行,每行为一种排列方案(排列方案按字典序排列, 相邻数字之间用空格分隔) ),最后一行输出排列方案总数。
【输入样例】
输入文件名:dfs3.in
3
输出文件名:dfs3.out
1 2 3

3 2 1

2

水dfs
#include <iostream>
#include <cstdio>

using namespace std;

#define MAX_N 16

int n;
int sel[MAX_N];
bool used[MAX_N];
int cnt=0;

bool IsPrime(int n)
{
int i=2;

while(i*i<=n)
{
if(n%i==0) return false;
i++;
}

return true;
}

void dfs(int cur)
{
if(cur==n)
{
for(int i=0;i<n-1;i++)
printf("%d ",sel[i]);
printf("%d\n",sel[n-1]);
cnt++;
return;
}

for(int i=1;i<=n;i++)
{
if(!used[i] && IsPrime(sel[cur-1]+i))
{
sel[cur]=i;
used[i]=true;
dfs(cur+1);
used[i]=false;
}
}
}

int main()
{
freopen("dfs3.in","r",stdin);
freopen("dfs3.out","w",stdout);

scanf("%d",&n);

for(int i=1;i<=n;i++)
{
sel[0]=i;
used[i]=true;
dfs(1);
used[i]=false;
}
printf("%d\n",cnt);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: