题意是给你个数(1-9) 表示密码里的数,用这几个数能组成多少个合法的密码并输出;
不和法的有132 及1连3 时经过了2 但是2有没有被走过 所以是不存在的 排除这种情况就行了
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; int n,mark[10],map[10],num[10]; int leap[11][11]; int sum; int judge(int a,int b) { int x=leap[a][b]; if(x==0) return 0; if(mark[x]==0) return 1; return 0; } int ans[150000][11]; int dfs(int t) { if(t==n+1) { sum++; for(int i=1;i<=n;i++) ans[sum][i]=num[i]; //printf("%d\n",sum); return 0; } int i; for(i=1;i<=9;i++) { if(map[i]==1&&mark[i]==0) { int flash=0; flash=judge(num[t-1],i); //printf("%d %d %d\n",num[t-1],i,flash); if(!flash) { mark[i]=1; num[t]=i; dfs(t+1); num[t]=0; mark[i]=0; } } } return 0; } int main() { int T,i,j; scanf("%d",&T); memset(leap,0,sizeof(leap)); leap[1][3]=leap[3][1]=2; leap[1][7]=leap[7][1]=4; leap[1][9]=leap[9][1]=5; leap[2][8]=leap[8][2]=5; leap[3][7]=leap[7][3]=5; leap[3][9]=leap[9][3]=6; leap[4][6]=leap[6][4]=5; leap[7][9]=leap[9][7]=8; while(T--) { scanf("%d",&n); memset(mark,0,sizeof(mark)); memset(map,0,sizeof(map)); for(i=1;i<=n;i++) { int a; scanf("%d",&a); map[a]=1; } sum=0; dfs(1); printf("%d\n",sum); for(i=1;i<=sum;i++) { for(j=1;j<=n;j++) { if(j!=1) printf(" "); printf("%d",ans[i][j]); } printf("\n"); } } return 0; }
时间: 2024-10-30 20:52:49