zoukankan      html  css  js  c++  java
  • 洛谷1123 取数游戏

    题目描述

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

    输入输出格式

    输入格式:
    输入第1行有一个正整数T,表示了有T组数据。

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

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

    输出格式:
    输出包含T行,每行一个非负整数,输出所求得的答案。

    输入输出样例

    输入样例#1: 复制
    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

    输出样例#1: 复制
    271
    172
    99
    说明

    对于第1组数据,取数方式如下:

    [67] 75 63 10

    29 29 [92] 14

    [21] 68 71 56

    8 67 [91] 25

    对于20%的数据,N, M≤3;

    对于40%的数据,N, M≤4;

    对于60%的数据,N, M≤5;

    对于100%的数据,N, M≤6,T≤20。

    此题用数据范围较小,所以深搜。注意一下不能用bool类型来标记取过的数周围的数,如:
    67 75 63 10
    29 29 92 14
    21 68 71 56
    8 67 91 25。
    这一组数据,
    第一遍搜索会选到67,63,21,71,如果用bool类型标记
    周围的数,回溯71时68,67就再次可以被选,而68,67有因为有21的限制不能选,所以只能用一个累加的b数组。

    #include<bits/stdc++.h>
    using namespace std;
    int t,n,m,a[8][8],ans=-1;
    int x[9]={-1,0,1,1,1,0,-1,-1},
        y[9]={-1,-1,-1,0,1,1,1,0};
    int b[8][8];
    inline void dfs(int ii,int jj,int sum){
        if(jj>m){
            jj=1;
            ii++;
        }
        if(ii==n+1) {ans=max(sum,ans);return;}
        if(!b[ii][jj]){
            sum+=a[ii][jj];
            for(register int i=0;i<=7;i++)  
                b[ii+x[i]][jj+y[i]]++;
            dfs(ii,jj+2,sum);
            sum-=a[ii][jj]; 
            for(register int i=0;i<=7;i++)
                b[ii+x[i]][jj+y[i]]--;
        }
        dfs(ii,jj+1,sum);    //如果不选。
    }
    int main(){
        scanf("%d",&t);
        for(register int i=1;i<=t;i++){
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            ans=-1;
            scanf("%d%d",&n,&m);
            for(register int j=1;j<=n;j++)
                for(register int k=1;k<=m;k++){
                    int xx;
                    scanf("%d",&xx);
                    a[j][k]=xx;
                }
            dfs(1,1,0);
            printf("%d
    ",ans);
        }
    }
  • 相关阅读:
    L309 单音节词读音规则(一)-辅音字母发音规则
    L308 New brain cells made throughout life
    L306 词汇题
    L305 发邮件15分钟
    L304 What Is Death?
    2019.3.22 Week 11 : ZigBee power test and field test
    L302 如何避免秃头
    2019.3.22 Week 12 : ZigBee and T/H chamber test
    L300 3月英语课下
    Pycharm使用方法之调整代码字体大小
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9677200.html
Copyright © 2011-2022 走看看