社区讨论

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 条回复,欢迎继续交流。

正在加载回复...