zoj 3861 Valid Pattern Lock(全排列 next_permutation 模拟)

#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;

}

  

你可能感兴趣的:(Pattern)