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;
}