Problem:平方排列
Description:
给你一个n,问能否将1到n这n个整数进行排列,使得这个排列中任意两个相邻的数字和都是平方数。如果能,输出这个排列(如果存在多个,输出字典序最小的),否则输出-1。
Input:
输入一个整数n (1 <= n <= 15)
Output:
如果存在这样的排列(如果存在多个,输出字典序最小的),输出n个以空格隔开的整数表示这个排列,否则输出-1。
Sample Input:
1
Sample Output:
1
Language:C++
#include <iostream>
#include <cmath>
using namespace std;
int n;
bool check;
int a[16],vis[16];
void dfs(int k)
{
if(k-1==n)
{
bool flag=true;
for(int i=1;i<n;i++)
{
int t=sqrt(a[i]+a[i+1]);
if(a[i]+a[i+1]!=t*t)
{
flag=false;
break;
}
}
if(flag)
{
for(int i=1;i<=n;i++)
cout<<a[i]<<(i==n ? '\n':' ');
check=true;
}
return;
}
for(int i=1;i<=n;i++)
{
int t=sqrt(i+a[k-1]);
if(k>1&&i+a[k-1]!=t*t) continue;
if(!vis[i]&&!check)
{
vis[i]=1;
a[k]=i;
dfs(k+1);
vis[i]=0;
}
}
}
int main()
{
while(cin>>n)
{
check=false;
dfs(1);
if(!check) cout<<-1<<endl;
}
return 0;
}