#include <iostream>
#include <cmath>
#include <stdio.h>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <iomanip>
#include <algorithm>
#include <memory.h>
using namespace std;
int n;
int a[10];
int may[10];
bool vis[10];
int mp[10][10];
int num;
void init()
{
memset(mp,0,sizeof(mp));
mp[1][9]=mp[9][1]=mp[3][7]=mp[7][3]=mp[2][8]=mp[8][2]=mp[4][6]=mp[6][4]=5;
mp[1][3]=mp[3][1]=2;
mp[1][7]=mp[7][1]=4;
mp[7][9]=mp[9][7]=8;
mp[3][9]=mp[9][3]=6;
}
int ans[400000][10];
void show()
{
for(int i=0; i<n; i++)
cout<<may[i]<<' ';
cout<<endl;
}
bool judge()
{
int viss[10];
memset(viss,0,sizeof(viss));
viss[0]=-1;
int s1=may[0],s2;
viss[s1]=1;
for(int i=1; i<n; i++)
{
s2=may[i];
if(viss[s2]==1)
return false;
if(mp[s1][s2]!=0&&viss[mp[s1][s2]]==0)
return false;
s1=s2;
viss[s2]=1;
}
for(int i=0; i<n; i++)
{
ans[num][i]=may[i];
}
num++;
return true;
}
void dfs(int p)
{
if(p==n)
{
judge();
return;
}
for(int i=0; i<n; i++)
{
if(vis[a[i]]==0)
{
may[p]=a[i];
vis[a[i]]=1;
dfs(p+1);
vis[a[i]]=0;
}
}
}
int main()
{
init();
int T;
cin>>T;
while(T--)
{
num=0;
cin>>n;
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
sort(a,a+n);
dfs(0);
cout<<num<<endl;
for(int i=0; i<num; i++)
{
for(int j=0; j<n-1; j++)
printf("%d ",ans[i][j]);
printf("%d\n",ans[i][n-1]);
}
}
return 0;
}
ZOJ 3861 - Valid Pattern Lock
最新推荐文章于 2022-06-05 09:00:32 发布