平方排列
Description
?給你一個n,問能否將1到n這n個整數進行排列,使得這個排列中任意兩個相鄰的數字和都是平方數。如果能,輸出這個排列(如果存在多個,輸出字典序最小的),否則輸出-1。
?
Input
?輸入一個整數n (1 <= n <= 15)
?
Output
?如果存在這樣的排列(如果存在多個,輸出字典序最小的),輸出n個以空格隔開的整數表示這個排列,否則輸出-1。
Sample Input
1Sample Output
1HINT
?
C++版本一
題解:
求上圖的哈密頓路徑
只有當n等于1和15時才存在
#include<bits/stdc++.h> using namespace std;int main() {int n;scanf("%d", &n);if(n == 1) printf("1\n"); else if(n == 15) printf("8 1 15 10 6 3 13 12 4 5 11 14 2 7 9\n");else printf("-1\n");return 0; }C++版本二
題解:
BFS
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <string.h> #include <cmath> #include <queue> using namespace std; typedef long long ll; const int N=10000; int t,n,m,flag; int a[N],vis[N];void bfs(int k){if(k==n+1){int f=1;for(int i=1;i<=n-1;i++){int tmp=(int)sqrt(a[i]+a[i+1]);if(a[i]+a[i+1]!=tmp*tmp){f=0;break;}}if(f){for(int i=1;i<=n-1;i++)printf("%d ",a[i]);printf("%d\n",a[n]);flag=1;}return;}for(int i=1;i<=n;i++){int tmp=(int)sqrt(i+a[k-1]);if(k>1&&i+a[k-1]!=tmp*tmp)continue;if(vis[i]==0&&flag==0){vis[i]=1;a[k]=i;bfs(k+1);vis[i]=0;}} } int main() {flag=0;scanf("%d",&n);bfs(1);if(flag==0)printf("%d\n",-1);return 0; }?
總結
- 上一篇: 粗题⼈不考你没学过的算法
- 下一篇: 四色图