题目链接在这里: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 }
未来是什么样,未来会发生什么,谁也不知道。
但是我知道,
起码从今天开始努力,
肯定比从明天开始努力,
要快一天实现梦想。
千里之行,始于足下! ——《那年那兔那些事儿》