很水的状态压缩+对抗搜索,说白了就是dp,记忆化搜索即可。。。
什么逗比状态,中途差点就睡着了。。。
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 5 6 int edge[25][2]; 7 int mp[17][17]; 8 9 void init() 10 { 11 memset(mp,0,sizeof(mp)); 12 int cnt = 0; 13 for (int i =1;i<=4;i++) 14 { 15 for (int j=1;j<4;j++) 16 { 17 int x = (i - 1)*4 + j; 18 ++cnt; 19 //printf("%d %d %d\n",x,x+1,cnt); 20 mp[x][x + 1] = mp[x + 1][x] = cnt; 21 edge[cnt][0] = x; 22 edge[cnt][1] = x + 1; 23 } 24 } 25 for (int j=1;j<=4;j++) 26 { 27 for (int i=1;i<4;i++) 28 { 29 int x = (i - 1)*4 + j; 30 ++cnt; 31 // printf("%d %d %d\n",x,x+4,cnt); 32 mp[x][x + 4] = mp[x + 4][x] = cnt; 33 edge[cnt][0] = x; 34 edge[cnt][1] = x + 4; 35 } 36 } 37 return ; 38 } 39 40 int n; 41 int vis[25]; 42 int viss[25]; 43 int calc() 44 { 45 int res = 0; 46 for (int i=1;i<4;i++) 47 for (int j=1;j<4;j++) 48 { 49 int x = (i - 1)*4 + j; 50 int e1 = mp[x][x+1]; 51 int e2 = mp[x+1][x+1+4]; 52 int e3 = mp[x][x+4]; 53 int e4 = mp[x+4][x+1+4]; 54 // printf("%d %d %d %d %d\n",x,e1,e2,e3,e4); 55 if (vis[e1] && vis[e2] && vis[e3] && vis[e4]){ 56 res = res + 1; 57 } 58 } 59 return res; 60 } 61 int nn ; 62 int pos[26]; 63 int dp[5555]; 64 65 int calc_1(int state){ 66 for (int i=1;i<=24;i++) 67 vis[i] = viss[i]; 68 for (int i=0;i<nn;i++) 69 if ((state & (1<<i))==0){ 70 vis[pos[i]] = 2; 71 } 72 return calc(); 73 } 74 int dfs(int state) 75 { 76 //printf(" %d\n",state); 77 if (dp[state] >= 0) 78 { 79 return dp[state]; 80 } 81 int tmp = calc_1(state); 82 int res = 0; 83 // printf("tmp = %d\n",tmp); 84 for (int i=0;i<nn;i++) 85 if ((state & (1<<i))){ 86 int ttt = dfs(state ^ (1<<i)); 87 int sss = 9 - tmp - ttt; 88 if (sss > res){ 89 res = sss; 90 } 91 } 92 dp[state] = res; 93 return dp[state]; 94 } 95 int main() 96 { 97 init(); 98 int cas, cast = 0; 99 // memset(vis,0,sizeof(vis)); 100 //vis[1] = vis[4] = vis[13] = vis[16] = 1; 101 //printf("%d\n",calc()); 102 scanf("%d",&cas); 103 while (cas--) 104 { 105 int Tom200 = 0; 106 int Jerry404 = 0; 107 108 scanf("%d",&n); 109 memset(vis,0,sizeof(vis)); 110 int tmp = 0; 111 int now = 1; 112 for (int i=1;i<=n;i++) 113 { 114 int u,v; 115 scanf("%d%d",&u,&v); 116 int id = mp[u][v]; 117 vis[id] = 1; 118 // printf("%d %d %d\n",u,v,id); 119 int temp = calc(); 120 if (now){ 121 Tom200 += temp - tmp; 122 }else{ 123 Jerry404 += temp - tmp; 124 } 125 now = 1 - now; 126 tmp = temp; 127 } 128 // printf("%d %d %d\n",Tom200 , Jerry404 , tmp); 129 130 nn = 0; 131 for (int i=1;i<=24;i++) 132 viss[i] = vis[i]; 133 for (int i=1;i<=24;i++) 134 if (vis[i]==0){ 135 pos[nn++] = i; 136 } 137 dp[0] = 0; 138 memset(dp,-1,sizeof(dp)); 139 tmp = dfs((1<<nn)-1); 140 // printf("%d\n",tmp); 141 if (now){ 142 Tom200 += tmp; 143 Jerry404 = 9 - Tom200; 144 }else{ 145 Jerry404 += tmp; 146 Tom200 = 9 - Jerry404; 147 } 148 // printf("%d %d %d\n",Tom200 , Jerry404 , tmp); 149 printf("Case #%d: ",++cast); 150 puts(Tom200 >Jerry404?"Tom200":"Jerry404"); 151 } 152 return 0; 153 }
为什么没写过就不敢写?不到100行不是很常规的题目么?
为什么没写过就不敢写?所有题目都是写过的还有什么意思?
为什么没写过就不敢写?
为什么没写过就不敢写?
无脑模拟,码了3个小时,为什么我们就调不出样例?