题目链接在这里: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