• ZOJ Problem Set


    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
    ", 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
    ",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
    ",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
    ",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
    ",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
    ",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 }
  • 相关阅读:
    Python eval 函数妙用
    502与504故障分析与解决方法
    [转]谈谈select, iocp, epoll,kqueue及各种网络I/O复用机制
    计算阶乘n!末尾0的个数
    C++中的Overload、Override和Overwrite
    C++中的空类与空结构体大小
    多线程编程之优先级翻转问题
    数据库原理之事务(二)
    数据库原理之事务(一)
    NoSQL之基础篇
  • 原文地址:https://www.cnblogs.com/nowandforever/p/4429990.html
Copyright © 2020-2023  润新知