码迷,mamicode.com
首页 > 其他好文 > 详细

ZOJ Problem Set - 3861 Valid Pattern Lock(dfs)

时间:2015-04-15 21:06:57      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

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 }

 

ZOJ Problem Set - 3861 Valid Pattern Lock(dfs)

标签:

原文地址:http://www.cnblogs.com/nowandforever/p/4429990.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!