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 }

 

posted @ 2015-04-13 19:02  下周LGD该赢了吧  阅读(222)  评论(0编辑  收藏  举报