P1123 取数游戏

题目描述

一个N \times MN×M的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻88个格子中的一个即认为这两个数字相邻),求取出数字和最大是多少。

输入格式

第1行有一个正整数TT,表示了有TT组数据。

对于每一组数据,第一行有两个正整数NN和MM,表示了数字矩阵为NN行MM列。

接下来NN行,每行MM个非负整数,描述了这个数字矩阵。

输出格式

TT行,每行一个非负整数,输出所求得的答案。

输入输出样例

输入

3
4 4
67 75 63 10
29 29 92 14
21 68 71 56
8 67 91 25
2 3
87 70 85
10 3 17
3 3
1 1 1
1 99 1
1 1 1

 输出

271
172
99

  

分析

  选择每种情况的时候会影响到后面的情况,所以需要用数组保存,之后直接搜索即可

程序

#include <bits/stdc++.h>
#define F(i , a , b) for(int i = (a) ; i <= (b) ; i++)

using namespace std;

int T, n, m, a[1001][1001];
int ans;
int check[1001][1001];

void dfs(int x , int y , int z)
{
    if(x > n)
    {
        ans = max(ans , z);
        return;
    }
    int X_Next = x;
    int Y_Next = y + 1;
    if(Y_Next > m)
    {
        Y_Next = 1;
        X_Next = x + 1;
    }
    if(! check[x - 1][y - 1] && ! check[x - 1][y] && ! check[x - 1][y + 1] && ! check[x][y - 1] && ! check[x][y + 1] && ! check[x + 1][y - 1] && ! check[x + 1][y] && ! check[x + 1][y + 1])
    {
        check[x][y] = 1;
        dfs(X_Next , Y_Next , z + a[x][y]);
        check[x][y] = 0;
    }
    dfs(X_Next , Y_Next , z);
}

int main()
{
    ios::sync_with_stdio(0);
    cin >> T;
    F(k , 1 , T)
    {
        ans = 0;
        cin >> n >> m;
        F(i , 1 , n)
            F(j , 1 , m)
                cin >> a[i][j];
        dfs(1 , 0 , 0);
        cout << ans << endl;
    }
    return 0;
}

 

  

posted @ 2020-10-22 20:14  Tenderfoot  阅读(172)  评论(0编辑  收藏  举报