再帰列挙配列@再帰遡及
6470 ワード
再帰列挙配列@再帰遡及
* UVA - 524 Prime Ring Problem*
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
set<int> q;
int flag[20];
int a[20];
int n;
void dfs(int v)
{
if(v == n && q.count(a[1]+a[n]))
{
for(int i = 1; i < n; i++)
cout << a[i] << " ";
cout << a[n] << endl;
}
else
{
for(int i=2; i<=n; i++)
{
if(!flag[i]&&q.count(i+a[v])) /// i ,
{
a[v+1]=i;
flag[i]=1; ///
dfs(v+1);
flag[i]=0; ///
}
}
}
}
int main()
{
freopen("in.txt", "r", stdin);
for(int i = 2; i <= 32; i++)
{
int j;
for(j = i-1; j>=1; j--)
{
if(i%j == 0) break;
}
if(j == 1) q.insert(i);
}
int cas = 0;
int f = 0;
while(cin >> n)
{
memset(flag, 0, sizeof(flag));
a[1] = 1;
if(f) cout << endl;
cout<<"Case "<":"<1;
dfs(1);
}
return 0;
}
1~nの配列を生成する
#include
#include
#include
#include
#include
using namespace std;
int A[1000];
void print_permutation(int n, int *A, int cur)
{
if(cur == n)
{
for(int i = 0; i < n; i++)
{
printf("%d ",A[i]);
}
printf("
");
}
else
for(int i = 1; i <= n; i++)
{
int ok = 1;
for(int j = 0; j < cur; j++)
if(A[j] == i) ok = 0; /// i A[0]~A[cur-1] ,
///
if(ok)
{
A[cur] = i;
print_permutation(n, A, cur+1);
}
}
}
int main()
{
//freopen("in.txt", "r", stdin);
print_permutation(4, A, 0);
return 0;
}