题意:给你 3*3的手机解锁图,问你解锁线段只穿过指定的点的种类数。
解题思路:把所有不能组成的组合打表出来特判 next_permutation就行了。
解题代码:
1 // File Name: b.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月12日 星期日 13时51分52秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 int t; 28 int n; 29 int a[15]; 30 int notok[][3] ={ 31 {1,3,2},{3,1,2},{1,7,4},{7,1,4}, 32 {1,9,5},{9,1,5},{4,6,5},{6,4,5}, 33 {7,9,8},{9,7,8},{7,3,5},{3,7,5}, 34 {2,8,5},{8,2,5},{3,9,6},{9,3,6} 35 }; 36 int vis[15]; 37 int ok() 38 { 39 int visn[15]; 40 memset(visn,0,sizeof(visn)); 41 for(int j = 1;j <= n-1;j ++) 42 { 43 for(int i = 0 ;i <= 15;i ++) 44 { 45 if(a[j] == notok[i][0] && a[j+1] == notok[i][1] &&visn[notok[i][2]] == 0 ) 46 return 0 ; 47 } 48 visn[a[j]] = 1; 49 } 50 return 1; 51 } 52 int main(){ 53 scanf("%d",&t); 54 while(t--) 55 { 56 scanf("%d",&n); 57 memset(vis,0,sizeof(vis)); 58 for(int i = 1;i <= n;i ++) 59 { 60 scanf("%d",&a[i]); 61 vis[a[i]] = 1; 62 } 63 int ans = 0 ; 64 sort(a+1,a+1+n); 65 do{ 66 if(ok()) 67 ans ++ ; 68 }while(next_permutation(a+1,a+1+n)); 69 printf("%d ",ans); 70 sort(a+1,a+1+n); 71 int tt = 0 ; 72 do{ 73 if(ok()) 74 { 75 for(int i = 1;i <= n;i ++) 76 printf(i == 1?"%d":" %d",a[i]); 77 printf(" "); 78 tt ++; 79 } 80 }while(next_permutation(a+1,a+1+n)); 81 //printf("%d ",tt); 82 83 } 84 return 0; 85 }