ZOJ Problem Set - 3861 Valid Pattern Lock(dfs)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3861

这道题当时没做出来,后来经过队友提醒才做出来。

3*3的九宫格,给你其中n个点按下面要求连起来:

1. 给你的n个点都要激活(至少经过一次)

2. 如果点A,B相连后要经过另一个点C,则C在序列中的位置必须在A,B之前 如 1 7 4是不合法的

3.线段相交是没关系的,如 7 6 9 4

我是直接生成n个数的全排列,然后在所有排列里面去掉不合法的。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cmath>
  4 #include <vector>
  5 #include <cstring>
  6 #include <string>
  7 #include <algorithm>
  8 #include <string>
  9 #include <set>
 10 #include <functional>
 11 #include <numeric>
 12 #include <sstream>
 13 #include <stack>
 14 #include <map>
 15 #include <queue>
 16
 17 #define CL(arr, val)    memset(arr, val, sizeof(arr))
 18
 19 #define ll long long
 20 #define inf 0x7f7f7f7f
 21 #define lc l,m,rt<<1
 22 #define rc m + 1,r,rt<<1|1
 23 #define pi acos(-1.0)
 24
 25 #define L(x)    (x) << 1
 26 #define R(x)    (x) << 1 | 1
 27 #define MID(l, r)   (l + r) >> 1
 28 #define Min(x, y)   (x) < (y) ? (x) : (y)
 29 #define Max(x, y)   (x) < (y) ? (y) : (x)
 30 #define E(x)        (1 << (x))
 31 #define iabs(x)     (x) < 0 ? -(x) : (x)
 32 #define OUT(x)  printf("%I64d\n", x)
 33 #define lowbit(x)   (x)&(-x)
 34 #define Read()  freopen("data.txt", "r", stdin)
 35 #define Write() freopen("a.txt", "w", stdout);
 36 #define maxn 1000000000
 37 #define N 500010
 38 using namespace std;
 39
 40 int b[N][15];
 41 int n,ans,p[15],flag[15];
 42
 43 bool check(int x)
 44 {
 45     memset(flag,0,sizeof(flag));  //标记访问或者没访问
 46     for(int i=0;i<n;i++)
 47     {
 48         flag[b[x][i]]=1;
 49         if((b[x][i]==1&&b[x][i+1]==9&&flag[5]==0)||(b[x][i]==9&&b[x][i+1]==1&&flag[5]==0)
 50            ||(b[x][i]==1&&b[x][i+1]==7&&flag[4]==0)||(b[x][i]==7&&b[x][i+1]==1&&flag[4]==0)
 51            ||(b[x][i]==1&&b[x][i+1]==3&&flag[2]==0)||(b[x][i]==3&&b[x][i+1]==1&&flag[2]==0)
 52            ||(b[x][i]==2&&b[x][i+1]==8&&flag[5]==0)||(b[x][i]==8&&b[x][i+1]==2&&flag[5]==0)
 53            ||(b[x][i]==3&&b[x][i+1]==9&&flag[6]==0)||(b[x][i]==9&&b[x][i+1]==3&&flag[6]==0)
 54            ||(b[x][i]==3&&b[x][i+1]==7&&flag[5]==0)||(b[x][i]==7&&b[x][i+1]==3&&flag[5]==0)
 55            ||(b[x][i]==4&&b[x][i+1]==6&&flag[5]==0)||(b[x][i]==6&&b[x][i+1]==4&&flag[5]==0)
 56            ||(b[x][i]==7&&b[x][i+1]==9&&flag[8]==0)||(b[x][i]==9&&b[x][i+1]==7&&flag[8]==0))
 57         return 0;
 58     }
 59     return 1;
 60 }
 61 int main()
 62 {
 63    //Read();
 64    //Write();
 65     int t;
 66     scanf("%d",&t);
 67     while(t--)
 68     {
 69         scanf("%d",&n);
 70         for(int i=0;i<n;i++) scanf("%d",&p[i]);
 71         sort(p,p+n);
 72         ans=0;
 73         memset(b,0,sizeof(b));
 74         do
 75         {
 76             for(int i=0;i<n;i++)
 77                 b[ans][i]=p[i];
 78             ans++;
 79         }while(next_permutation(p,p+n));
 80         int x=ans;
 81         for(int i=0;i<ans;i++)
 82         {
 83             if(check(i)==0)
 84                 x--;
 85         }
 86         printf("%d\n",x);
 87         for(int i=0;i<ans;i++)
 88         {
 89             if(check(i))
 90             {
 91                 for(int j=0;j<n;j++)
 92                 {
 93                     if(j!=n-1)
 94                     printf("%d ",b[i][j]);
 95                     else
 96                     printf("%d\n",b[i][j]);
 97                 }
 98             }
 99
100         }
101     }
102     return 0;
103 }
时间: 2024-10-24 18:33:07

ZOJ Problem Set - 3861 Valid Pattern Lock(dfs)的相关文章

ZOJ - 3861 Valid Pattern Lock(dfs或其他,两种解法)

Valid Pattern Lock Time Limit: 2000MS   Memory Limit: 65536KB   64bit IO Format: %lld & %llu Submit Status Description Pattern lock security is generally used in Android handsets instead of a password. The pattern lock can be set by joining points on

zoj 3861 Valid Pattern Lock(以及自己对dfs的一些理解)

解法:先将每个点之间的可达性用c[][]记录,为0的话代表可以直接走到.但是如果要进行像3 1 2 这样的走法的话必须要先经过他们中间的点2,否则是不能走的. 用c[i][j]记录i和j之间必须要经过的点.然后进行dfs搜索即可. 经过这道题,自己对dfs的递归过程又有了更加深刻的了解.一开始的时候对dfs里面的参数有些疑虑,-->像这样dfs(s[0],0),但是这样的话,每次都要先判断c[x][s[i]] 这样是错误的.dfs(0,0)的话,因为0与1~9都是可以直接到达的(0是自己添加的)

zoj 3861 Valid Pattern Lock(全排列 模拟)

#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<stdlib.h> #include<queue> #include<stack> #include<vector> #include<algorithm> #define LL long long using namespace std; i

DFS+模拟 ZOJ 3861 Valid Pattern Lock

题目传送门 1 /* 2 题意:手机划屏解锁,一笔连通所有数字,输出所有可能的路径: 3 DFS:全排列 + ok () 判断函数,去除一些不可能连通的点:) 4 */ 5 #include <cstdio> 6 #include <iostream> 7 #include <algorithm> 8 #include <cstring> 9 #include <string> 10 #include <map> 11 #includ

ZOJ 3861 Valid Pattern Lock DFS

每个点有16种方向,向某个方向走一步或者两步,dfs把找到的数都存下来就可以了..... Valid Pattern Lock Time Limit: 2 Seconds      Memory Limit: 65536 KB Pattern lock security is generally used in Android handsets instead of a password. The pattern lock can be set by joining points on a 3

ZOJ 3861 Valid Pattern Lock

题意:画图案所的问题,给出一个3 × 3拨号盘中的几个数字作为活跃点,问由活跃点能组合多少种解锁方式,并输出它们.一个合法的解锁方式包含以下几点: 一个方案中由一些点构成,每个点在按顺序触摸的时候都是第一次被触摸到,称这些点为活跃点. 如果在连接A,B两点的时候经过了另外的点,那么这个点必须出现在序列中,并且在A和B之前出现. 一个点被合法的线段多次通过是可以的,只要这个点在之前合法出现过. 解法:枚举排列,挨个判断是否合法,因为之前读错过题……所以写的比较啰嗦……正常应该不是很难写……就不介绍

[水题+dfs] zoj 3861 Valid Pattern Lock

题意: 给n个不同的整数(3<=n<=9),问你能绘制出多少种解锁的方案. 输出方案数,以及按字典序输出每种方案. 思路: 一个很水的dfs全排列,加上特判就好了. 特判就是1->9的话就必定经过5等. 这里要注意的是. 中间所经过的数字是必须存在的. 比如要想1->9就必须有5. 5要么被用过,要么就经过5 例子就是 1 3 5 9这四个数. 实际的方案是只有2种 3 5 1 9 和 3 5 9 1 然后就是输入完排下序,保证字典序. 最后就是弱太弱了,写了2个dfs一个算个数,

浙江大学2015年校赛B题 ZOJ 3861 Valid Pattern Lock

这道题目是队友写的,貌似是用暴力枚举出来. 题意:给出一组数,要求这组数在解锁的界面可能的滑动序列. 思路:按照是否能够直接到达建图,如1可以直接到2,但是1不能直接到3,因为中间必须经过一个2. 要注意的假如2已结访问过,那么1就可以直接到2. 建图DFS,图要更新. Source Code: #include <stdio.h> #include <string.h> int node[10], ans[10], n, vis[10], k, fun[1000000][10];

解题报告 之 ZOJ3861 Valid Pattern Lock

解题报告 之 ZOJ3861 Valid Pattern Lock Description Pattern lock security is generally used in Android handsets instead of a password. The pattern lock can be set by joining points on a 3 × 3 matrix in a chosen order. The points of the matrix are registere