社区讨论
WA *5 求救 必关
P1123取数游戏参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhjgvzmt
- 此快照首次捕获于
- 2025/11/04 02:22 4 个月前
- 此快照最后确认于
- 2025/11/04 02:22 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
short a[8][8];
bool b[9][9] = {0};
int T;
int m, n;
unsigned long ans = 0;
bool Judge(int x, int y);
void search(
int row,
unsigned long
sum); //计划按行搜索
//因为是非负整数,所以,肯定是选择的数字越多越好,不用考虑长度(选取的数字数量问题)
int main()
{
scanf("%d", &T);
for (int i = 0; i < T; i++)
{
cin >> n >> m; //表示了数字矩阵为 N 行 M 列
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
scanf("%d", &a[i][j]);
search(0, 0);
cout << ans << endl; //求得的答案
memset(b, 0, sizeof(b)); //重置布尔标记数组
ans = 0; //重置答案
}
return 0;
}
void search(int row, unsigned long sum)
{
if (row == n ) //因为从零开始计数 若到达终点
{
ans = max(ans, sum); //选取最大的
return;
}
search(row + 1, sum); //不选本行的元素
for (int i = 0; i < m; i++) // N 行 M 列
{
if (Judge(row, i) &&
!b[row][i]) //合法(不与它周围另一个满足条件的数相邻),且没选过
{
b[row][i] = 1; //标记用过 //累加和
search(row + 1, sum + a[row][i]); //搜索下一行
b[row][i] = 0; //回溯
}
}
}
bool Judge(int x, int y)
{
for (int i = -1; i <= 1; i++)
{
for (
int j = -1; j <= 1;
j++) //从这个坐标开始向它的8个方向遍历,如果发现:只要有一个选过了,就返回false(不合法)
{
if (i==0 && j==0) continue;
int xx = x + i;
int yy = y + j;
if (xx >= 0 && xx < n && yy >= 0 && yy < m && b[xx][yy] == 1)
{
return false;
}
}
}
return true;
}
```样例只有中间的172没过
回复
共 3 条回复,欢迎继续交流。
正在加载回复...