这个问题,其实也不算复杂,就是不是太复杂,也许是我的状态不太好的原因吧,这个题目有两种解法,一个是dfs,另外一个是枚举全排列,个人喜欢第二种,原因可想而知,还有就是next_permutation()的时间复杂度好像是O(len)的,这个和手写的是差不多的,其实我还没有手写过,应该是一个深搜吧,这个题目是zoj 3861,但是zoj前一段时已经挂了,
这里就·贴一份不指导1有没有ac的代码。
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
using namespace std;
int a[11];
int mp[11][11];
int vis[11];
int n, kind;
int result[400000][10];
void init()
{
mp[1][3] = 2; mp[3][1] = 2;
mp[1][7] = 4; mp[7][1] = 4;
mp[1][9] = 5; mp[9][1] = 5;
mp[2][8] = 5; mp[8][2] = 5;
mp[3][7] = 5; mp[7][3] = 5;
mp[3][9] = 6; mp[9][3] = 6;
mp[4][6] = 5; mp[6][4] = 5;
mp[7][9] = 8; mp[9][7] = 8;
}
bool can()
{
int v;
vis[a[0]] = 1;
for (int i = 1; i < n; i++)
{
v = mp[a[i]][a[i - 1]];
if (!(!vis[a[i]] && (!v || vis[v])))
return false;
vis[a[i]] = 1;
}
return true;
}
int main()
{
int t;
cin >> t;
init();
while (t--)
{
scanf("%d", &n);
for (int i = 0; i<n; i++) scanf("%d", &a[i]);
sort(a, a + n);
kind = 0;
do
{
memset(vis, 0, sizeof(vis));
if (can())
{
kind++;
for (int i = 0; i < n; i++)
result[kind][i] = a[i];
}
} while (next_permutation(a, a + n));
printf("%d\n", kind);
for (int i = 1; i <= kind; i++)
{
for (int j = 0; j < n - 1; j++)
printf("%d ", result[i][j]);
printf("%d\n", result[i][n-1]);
}
}
}
枚举的解法。