很繁琐的爆搜,最多要加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 }