概述
计蒜客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("%dn", DFS(1));
}
return 0;
}
最后
以上就是孤独早晨为你收集整理的Rake It In ( DFS)计蒜客Rake It In的全部内容,希望文章能够帮你解决Rake It In ( DFS)计蒜客Rake It In所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复