标签:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
#define LL long long
using namespace std;
int map[10][10];
int vis[10][10];
int a[10];
int ans[400000][10];
void init()//不存在为1,存在为0
{
map[1][3]=map[3][1]=1;
map[1][9]=map[9][1]=1;
map[1][7]=map[7][1]=1;
map[2][8]=map[8][2]=1;
map[3][7]=map[7][3]=1;
map[3][9]=map[9][3]=1;
map[4][6]=map[6][4]=1;
map[7][9]=map[9][7]=1;
}
void panduan(int i)
{
if(i==2||i==8)
{
vis[i-1][i+1]=vis[i+1][i-1]=1;
}
else if(i==4||i==6)
{
vis[i-3][i+3]=vis[i+3][i-3]=1;
}
else if(i==5)
{
vis[1][9]=vis[9][1]=1;
vis[2][8]=vis[8][2]=1;
vis[3][7]=vis[7][3]=1;
vis[4][6]=vis[6][4]=1;
}
/*if(a[1]==5&&a[2]==4&&a[3]==3&&a[4]==1)
{
if(vis[1][3]==1) printf("%d...\n",i);
}*/
}
int main()
{
int kase,n;
int i,j,k;
scanf("%d",&kase);
while(kase--)
{
memset(map,0,sizeof(map));
int cnt=-1;
init();
scanf("%d",&n);
for( i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1);
do
{
//if(a[1]==5&&a[2]==4&&a[3]==3&&a[4]==1)
memset(vis,0,sizeof(vis));
for( i=1;i<n;i++)
{
panduan(a[i]);
if(map[a[i]][a[i+1]]==1&&vis[a[i]][a[i+1]]==0) break;
}
if(i==n)
{
cnt++;
for(i=1;i<=n;i++)
{
ans[cnt][i]=a[i];
}
}
}while(next_permutation(a+1,a+n+1));
printf("%d\n",cnt+1);
for(i=0;i<=cnt;i++)
{
for(j=1;j<=n;j++)
{
printf("%d",ans[i][j]);
if(j!=n) printf(" ");
}
printf("\n");
}
}
return 0;
}
zoj 3861 Valid Pattern Lock(全排列 模拟)
标签:
原文地址:http://www.cnblogs.com/sola1994/p/4445379.html