zoukankan      html  css  js  c++  java
  • 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
    ", 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("
    ");
    80         }
    81     }
    82     return 0;
    83 }
  • 相关阅读:
    [CSP-S模拟测试]:答题(meet in the middle)
    __AFO
    BZOJ4332 JSOI2012 分零食 【倍增 + NTT】
    CF528D Fuzzy Search 【NTT】
    uoj【UNR #3】To Do Tree 【贪心】
    uoj233/BZOJ4654/洛谷P1721 [Noi2016]国王饮水记 【dp + 斜率优化】
    BZOJ2150 部落战争 【带上下界最小流】
    洛谷P4240 毒瘤之神的考验 【莫比乌斯反演 + 分块打表】
    BZOJ3235 [Ahoi2013]好方的蛇 【单调栈 + dp】
    51nod1236 序列求和 V3 【数学】
  • 原文地址:https://www.cnblogs.com/titicia/p/4422981.html
Copyright © 2011-2022 走看看