可惜没如果=_=
时光的河入海流

题目链接在这里:A-Rake It In_牛客竞赛博弈专题班组合游戏基本概念、对抗搜索、Bash游戏、Nim游戏习题 (nowcoder.com)

这题是一道比较基础的minmax搜索,只需要注意一下剪枝的操作是怎么写的就行了。不过数组开大也能tle是我没想到的……

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 int n,t,k;
 4 struct Node{
 5     int a[5][5];
 6     int reans(int x,int y){
 7         return a[x][y]+a[x][y+1]+a[x+1][y]+a[x+1][y+1];
 8     }
 9     void out(){
10         int i,j;
11         for (i=1;i<=4;i++){
12             for (j=1;j<=4;j++)
13                 cout<<a[i][j]<<' ';
14                 cout<<endl;
15         }
16         cout<<endl;
17     }
18 };
19     //1 2
20     //3 4
21     
22     //2 4
23     //1 3
24 inline int mx(int x,int y){return x>y?x:y;}
25 inline int mn(int x,int y){return x<y?x:y;}
26 Node rot(Node zt,int x,int y){
27     swap(zt.a[x][y],zt.a[x][y+1]);
28     swap(zt.a[x][y+1],zt.a[x+1][y+1]);
29     swap(zt.a[x+1][y+1],zt.a[x+1][y]);
30     return zt;
31 }
32 int dfs(int step,Node now){
33 //    Node zt=now;
34 //    zt.out();
35     int i,j,an=0,an1;
36 //    if (step==3) cout<<"????????????"<<endl;
37     if (step>(k<<1)) return 0;
38     if ((step&1)==0) an=1e8;
39     for (i=1;i<=3;i++)
40         for (j=1;j<=3;j++){
41             an1=now.reans(i,j);
42 //            if (step==2) cout<<"!!!!!!! "<<i<<' '<<j<<' '<<an1<<endl;
43             if (step&1){
44                 if (an1+40*(k*2-step)>an)
45                     an=mx(an,dfs(step+1,rot(now,i,j))+an1);
46             }
47             else
48                 if (an1<an)
49                 an=mn(an,dfs(step+1,rot(now,i,j))+an1);
50         }
51 //    cout<<step<<' '<<an<<endl;
52     return an;
53 }
54 int main(){
55     int i,j;
56     Node zt;
57     scanf("%d",&t);
58     while (t--){
59         scanf("%d",&k);
60         for (i=1;i<=4;i++)
61             for (j=1;j<=4;j++)
62                 scanf("%d",&zt.a[i][j]);
63         printf("%d\n",dfs(1,zt));
64     }
65     return 0;
66 }

 

posted on 2022-10-19 17:44  珍珠鸟  阅读(37)  评论(0编辑  收藏  举报