当前位置: 代码迷 >> 综合 >> Rake It In ( DFS)
  详细解决方案

Rake It In ( DFS)

热度:33   发布时间:2024-01-19 07:45:16.0

计蒜客Rake It In

由于k<=3,t<=200,可以想到,在最坏的情况下,暴力计算出每一层的最优解,一共也只有6层,时间最多为200*(9^6)。暴力递归(回溯)出每一层的最优解,进而求取最终答案。

#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <map>
#include <vector>
#include <algorithm>
#include <cmath>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;int a[5][5];
const int n = 4;
int k;void cc(int i,int j)
{int tmp=a[i][j];a[i][j]=a[i][j+1];a[i][j+1]=a[i+1][j+1];a[i+1][j+1]=a[i+1][j];a[i+1][j]=tmp;
}void ee(int i,int j)
{int tmp=a[i][j];a[i][j]=a[i+1][j];a[i+1][j]=a[i+1][j+1];a[i+1][j+1]=a[i][j+1];a[i][j+1]=tmp;
}int dd(int x,int y)
{return a[x][y] + a[x + 1][y] + a[x][y + 1] + a[x + 1][y + 1];
}int DFS(int num)
{int ans = 0;if (num == 2 * k){int mini = inf;for (int i = 1; i < n; i++){for (int j = 1; j < n;j++){mini = min(mini, dd(i, j));}}return mini;}else if(num%2==1){int mx = 0;for (int i = 1; i < n; i++){for (int j = 1; j < n;j++){cc(i, j);int sum = dd(i, j) + DFS(num + 1);mx = max(mx, sum);ee(i, j);}}return mx;}else if(num%2==0){int mini = inf;for (int i = 1; i < n; i++){for (int j = 1; j < n;j++){cc(i, j);int sum = dd(i, j) + DFS(num + 1);mini = min(mini, sum);ee(i, j);}}return mini;}
}int main()
{int T;scanf("%d", &T);while(T--){scanf("%d", &k);for (int i = 1; i <= n; i++)for (int j = 1; j <= n;j++)scanf("%d", &a[i][j]);printf("%d\n", DFS(1));}return 0;
}