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 }

 dfs也可以做!

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 int mp[10][10];
 9 int a[10];
10 int n;
11 bool vis[10];
12 int cnt;
13 int s[10];
14 
15 void init()
16 {
17     mp[1][3] = 2; mp[3][1] = 2;
18     mp[1][7] = 4; mp[7][1] = 4;
19     mp[1][9] = 5; mp[9][1] = 5;
20     mp[2][8] = 5; mp[8][2] = 5;
21     mp[3][7] = 5; mp[7][3] = 5;
22     mp[3][9] = 6; mp[9][3] = 6;
23     mp[4][6] = 5; mp[6][4] = 5;
24     mp[7][9] = 8; mp[9][7] = 8;
25 }
26 
27 void dfs(int pre,int num,int op)
28 {
29 //    printf("%d %d\n",pre,num);
30     int i,t;
31     if(num==n)
32     {
33         if(op){
34             for(i=0;i<n-1;i++)printf("%d ",s[i]);
35             printf("%d\n",s[n-1]);
36         }
37         cnt++;
38         return;
39     }
40 
41     for(i=0;i<n;i++)
42     {
43         if(!vis[a[i]])
44         {
45             if(mp[pre][a[i]]==0||vis[mp[pre][a[i]]]==true)
46             {
47                     vis[a[i]]=true;
48                     s[num]=a[i];
49                     dfs(a[i],num+1,op);
50                     vis[a[i]]=false;
51             }
52         }
53     }
54 }
55 int main()
56 {
57     //freopen("a.txt","r",stdin);
58     int T,i,j;
59     scanf("%d",&T);
60     init();
61     while(T--)
62     {
63         scanf("%d",&n);
64         for(i=0;i<n;i++){
65             scanf("%d",&a[i]);
66         }
67         sort(a,a+n);
68         cnt=0;
69         for(i=0;i<n;i++){
70             memset(vis,false,sizeof(vis));
71             vis[a[i]]=true;
72             s[0]=a[i];
73             dfs(a[i],1,0);
74         }
75         printf("%d\n",cnt);
76         for(i=0;i<n;i++){
77             memset(vis,false,sizeof(vis));
78             vis[a[i]]=true;
79             s[0]=a[i];
80             dfs(a[i],1,1);
81         }
82     }
83     return 0;
84 }

 

posted @ 2015-04-15 19:44  NowAndForever  阅读(145)  评论(0编辑  收藏  举报