zoukankan      html  css  js  c++  java
  • HDU 4753 Fishhead’s Little Game(DFS)

    题目链接

    很繁琐的爆搜,最多要加2^12条边,暴力就可以,回溯那部分一直没有回溯好,写了一晚上。。。代码非常,非常难看。。对了,还不是普通的爆搜,双向搜索博弈,以前记得看过,这次好像第一次写。。

      1 #include <iostream>
      2 #include <cstring>
      3 #include <cstdio>
      4 #include <cmath>
      5 #include <algorithm>
      6 using namespace std;
      7 int p[40][40],flag[101],o[41][41];
      8 int que[30];
      9 int sp[100];
     10 int sf[101];
     11 int num,sz;
     12 int t1,t2;
     13 int dfs1(int x,int tc,int jc);
     14 int dfs2(int x,int tc,int jc);
     15 int fun(int a,int b,int c,int nu)
     16 {
     17     if(sz == 1)
     18     {
     19         if(sf[nu] == 0&&sp[a]&&sp[b]&&sp[c])
     20         {
     21             sf[nu] = 1;
     22             return 1;
     23         }
     24         else
     25             return 0;
     26     }
     27     else
     28     {
     29         if(sf[nu] == 1&&sp[a]&&sp[b]&&sp[c])
     30         {
     31             sf[nu] = 0;
     32             return 1;
     33         }
     34         else
     35             return 0;
     36     }
     37 }
     38 int judge(int x)
     39 {
     40     if(x <= 2)
     41         return fun(12+x,13+x,3+x,x);
     42     else if(x <= 5)
     43         return fun(x-3,x+9,x+10,x-3) + fun(x+3,x+13,x+14,x);
     44     else if(x <= 8)
     45         return fun(x-3,x+10,x+11,x-3) + fun(x+3,x+14,x+15,x);
     46     else if(x <= 11)
     47         return fun(x-3,x+11,x+12,x-3);
     48     else if(x == 12)
     49         return fun(3,0,13,0);
     50     else if(x == 15)
     51         return fun(2,5,14,2);
     52     else if(x == 16)
     53         return fun(3,6,17,3);
     54     else if(x == 19)
     55         return fun(5,8,18,5);
     56     else if(x == 20)
     57         return fun(6,9,21,6);
     58     else if(x == 23)
     59         return fun(8,11,22,8);
     60     else if(x == 14|| x == 13)
     61         return fun(x-1,x-13,x-10,x-13) + fun(x+1,x-12,x-9,x-12);
     62     else if(x == 17||x == 18)
     63         return fun(x-1,x-14,x-11,x-14) + fun(x+1,x-13,x-10,x-13);
     64     else if(x == 22||x == 21)
     65         return fun(x-1,x-15,x-12,x-15) + fun(x+1,x-14,x-11,x-14);
     66     return 0;
     67 }
     68 int dfs1(int x,int tc,int jc)
     69 {
     70     int i,z,s;
     71     if(x == (1<<num)-1)
     72     {
     73         if(tc > jc)
     74             return 1;
     75         else
     76             return 0;
     77     }
     78     s = 0;
     79     for(i = 0; i < num; i ++)
     80     {
     81         if((x&(1<<i)) == 0)
     82         {
     83             sz = 1;
     84             z = judge(que[i]);
     85             sp[que[i]] = 1;
     86             if(dfs2(x+(1<<i),tc+z,jc) == 0)
     87             s = 1;
     88             sp[que[i]] = 0;
     89             sz = 0;
     90             judge(que[i]);
     91         }
     92         if(s) return s;//为了回溯,回溯完了,再返回。
     93     }
     94     return s;
     95 }
     96 int dfs2(int x,int tc,int jc)
     97 {
     98     int i,z,s;
     99     if(x == (1<<num)-1)
    100     {
    101         if(tc > jc)
    102             return 0;
    103         else
    104             return 1;
    105     }
    106     s = 0;
    107     for(i = 0; i < num; i ++)
    108     {
    109         if((x&(1<<i)) == 0)
    110         {
    111             sz = 1;
    112             sp[que[i]] = 1;
    113             z = judge(que[i]);
    114             if(dfs1(x+(1<<i),tc,jc+z) == 0)
    115             s = 1;
    116             sz = 0;
    117             judge(que[i]);
    118             sp[que[i]] = 0;
    119         }
    120         if(s) return s;
    121     }
    122     return s;
    123 }
    124 int main()
    125 {
    126     int i,j,k,t,u,v,n,tc,jc,cas = 1;
    127     k = 1;
    128     for(i = 1; i <= 4; i ++)
    129     {
    130         for(j = 1; j <= 4; j ++)
    131             p[i][j] = k ++;
    132     }
    133     k = 0;
    134     for(i = 1; i <= 4; i ++)
    135     {
    136         for(j = 1; j <= 3; j ++)
    137         {
    138             // printf("%d %d
    ",p[i][j],p[i][j+1]);
    139             o[p[i][j]][p[i][j+1]] = k ++;
    140         }
    141     }
    142     for(i = 1; i <= 3; i ++)
    143     {
    144         for(j = 1; j <= 4; j ++)
    145         {
    146             //printf("%d %d
    ",p[i][j],p[i+1][j]);
    147             o[p[i][j]][p[i+1][j]] = k ++;
    148         }
    149     }
    150     scanf("%d",&t);
    151     while(t--)
    152     {
    153         memset(flag,0,sizeof(flag));
    154         memset(sp,0,sizeof(sp));
    155         memset(sf,0,sizeof(sf));
    156         scanf("%d",&n);
    157         num = 0;
    158         tc = jc = 0;
    159         sz = 1;
    160         for(i = 0; i < n; i ++)
    161         {
    162             scanf("%d%d",&u,&v);
    163             int te;
    164             if(u > v)
    165             {
    166                 te = u;
    167                 u = v;
    168                 v = te;
    169             }
    170             if(i%2 == 0)
    171                 tc += judge(o[u][v]);
    172             else
    173                 jc += judge(o[u][v]);
    174             flag[o[u][v]] = 1;
    175             sp[o[u][v]] = 1;
    176         }
    177         for(i = 0; i < 24; i ++)
    178         {
    179             if(!flag[i])
    180                 que[num++] = i;
    181         }
    182         printf("Case #%d: ",cas ++);
    183         if(n%2 == 0)
    184         {
    185             if(dfs1(0,tc,jc))
    186                 printf("Tom200
    ");
    187             else
    188                 printf("Jerry404
    ");
    189         }
    190         else
    191         {
    192             if(dfs1(0,jc,tc))
    193                 printf("Jerry404
    ");
    194             else
    195                 printf("Tom200
    ");
    196         }
    197     }
    198     return 0;
    199 }
  • 相关阅读:
    ubuntu查看安装的pytorch/cuda版本
    go不使用工具包将大写字符转成小写字符的方法
    使用Nexus搭建Maven私服
    maven setting.xml配置说明
    maven的仓库、生命周期与插件
    maven项目搭建
    maven之详解继承与聚合
    Maven核心概念之依赖,聚合与继承
    commons-logging日志系统
    新建我的 第一个maven项目
  • 原文地址:https://www.cnblogs.com/naix-x/p/3336182.html
Copyright © 2011-2022 走看看