ZOJ3861 Valid Pattern Lock
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3861
题意:给出一组数,要求这组数在解锁的界面可能的滑动序列。
思路:按照是否能够直接到达建图,如1可以直接到2,但是1不能直接到3,因为中间必须经过一个2。
要注意的假如2已结访问过,那么1就可以直接到3。
建图DFS,图要更新。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <string> 5 #include <iomanip> 6 #include <vector> 7 #include <algorithm> 8 using namespace std; 9 int T, n; 10 vector <vector <int> > s; 11 int mark[10], a[10]; 12 class Vis{ 13 public: 14 int vis[10]; 15 public: 16 void re(){ 17 memset(vis, 0, sizeof(vis)); 18 } 19 }; 20 class Map{ 21 public: 22 int mp[10][10]; 23 public: 24 void re(){ 25 for(int i = 1; i <= 9; i++){ 26 for(int j = 1; j <= 9; j++){ 27 if(i != j) mp[i][j] = 1; 28 else mp[i][j] = 0; 29 } 30 } 31 mp[1][3] = mp[1][7] = mp[1][9] = 0; mp[2][8] = 0; 32 mp[3][1] = mp[3][7] = mp[3][9] = 0; mp[4][6] = 0; 33 mp[6][4] = 0; mp[7][1] = mp[7][3] = mp[7][9] = 0; 34 mp[8][2] = 0; mp[9][1] = mp[9][3] = mp[9][7] = 0; 35 } 36 }; 37 void DFS(int str, int cnt, vector <int> temp, Vis v, Map m){ 38 temp.push_back(str); 39 if(cnt == n){ 40 s.push_back(temp); 41 return; 42 } 43 v.vis[str] = 1; 44 for(int i = 1; i <= 9; i++){ 45 if(v.vis[2]) m.mp[1][3] = m.mp[3][1] = 1; 46 if(v.vis[4]) m.mp[1][7] = m.mp[7][1] = 1; 47 if(v.vis[8]) m.mp[9][7] = m.mp[7][9] = 1; 48 if(v.vis[6]) m.mp[9][3] = m.mp[3][9] = 1; 49 if(v.vis[5]) m.mp[1][9] = m.mp[9][1] = m.mp[3][7] = m.mp[7][3] 50 = m.mp[4][6] = m.mp[6][4] = m.mp[2][8] = m.mp[8][2] = 1;; 51 if(m.mp[str][i] == 1 && mark[i] == 1 && !v.vis[i]){ 52 DFS(i, cnt+1, temp, v, m); 53 } 54 } 55 } 56 int main(){ 57 scanf("%d", &T); 58 while(T--){ 59 scanf("%d", &n); 60 memset(mark, 0, sizeof(mark)); 61 s.clear(); 62 for(int i = 1; i <= n; i++){ 63 scanf("%d", &a[i]); 64 mark[a[i]] = 1; 65 } 66 sort(a+1,a+1+n); 67 for(int i = 1; i <= n; i++){ 68 Vis v; v.re(); 69 Map m; m.re(); 70 vector <int> temp; 71 DFS(a[i], 1, temp, v, m); 72 } 73 printf("%d\n", s.size()); 74 for(int i = 0; i < s.size(); i++){ 75 for(int j = 0; j < s[i].size(); j++){ 76 if(j == 0) printf("%d", s[i][j]); 77 else printf(" %d", s[i][j]); 78 } 79 printf("\n"); 80 } 81 } 82 return 0; 83 }