题意
给定 C C C,表示有 C C C 个 11 × 11 11 \times 11 11×11 的矩阵,每一行表示某个球员在每个位置上的能力值,求 11 11 11 个球员能力值最大是多少。
分析
使用比较水的 dfs
进行解答。
现在用 k k k 表示第 k k k 个位置,用 c n t cnt cnt 表示当前到这个位置之前所有的能力值之和。
很简单的思路:
-
从第 1 1 1 行开始搜索,判断每一行的每一个位置是否大于 0 0 0,以及是否搜索过。如果成功进入判断,就标记当前位置,然后当前位置加 1 1 1,能力值总和加上当前能力值,继续搜索,再回溯。
-
当超过了 11 11 11 行的时候,使用 a n s ans ans 记录最大的能力值总和即可。
Code
#include <cstdio>
#include <cstring>
using namespace std;
bool bz[12];
int C, ans, a[17][17];
// 深搜
void dfs (int, int);
int main() {
// C 组数据
scanf ("%d", &C);
while (C--) {
// 答案清零
ans = 0;
// 初始化标记数组
memset (bz, 0, sizeof(bz));
// 输入
for (int i = 1; i <= 11; i++) {
for (int j = 1; j <= 11; j++)
scanf ("%d", &a[i][j]);
}
// 调用深搜
dfs (1, 0);
// 输出答案
printf ("%d\n", ans);
}
return 0;
}
void dfs (int k, int cnt) {
// 全部搜完
if (k > 11) {
// 更新答案
if (cnt > ans)
ans = cnt;
// 返回
return;
}
// 循环 11 行
for (int i = 1; i <= 11; i++) {
// 判断第 i 行第 k 个位置是否不为 0,以及是否搜索过
if (a[i][k] > 0 && bz[i] == 0) {
// 标记
bz[i] = 1;
// 下一个位置,加上当前能力值
dfs (k + 1, cnt + a[i][k]);
// 回溯
bz[i] = 0;
}
}
}
完结撒花。