HDU 4753 Fishhead’s Little Game(对抗搜索\DP+状态压缩)

很水的状态压缩+对抗搜索,说白了就是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 }
hdu4753

 

 

为什么没写过就不敢写?不到100行不是很常规的题目么?

为什么没写过就不敢写?所有题目都是写过的还有什么意思?

为什么没写过就不敢写?

为什么没写过就不敢写?

 

无脑模拟,码了3个小时,为什么我们就调不出样例?

转载于:https://www.cnblogs.com/wangsouc/articles/3332876.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值