首页 > 其他分享 >洛谷 P1123 取数游戏 (又是写了好久 最后还是无奈看了题解……)

洛谷 P1123 取数游戏 (又是写了好久 最后还是无奈看了题解……)

时间:2023-01-21 23:55:40浏览次数:57  
标签:洛谷 int 题解 sum dfs 取数 ++ sm

对于这个题感觉是一个比较典型的dfs.本题的状态是 对于每个数字你可以选也可以不选,但是一旦你选定某个数字之后,他会对其周围的数字产生影响所以一定要标记好(注意这里标记的时候不能用 布尔数组 一定要用一个整形的数组,因为可能出现两个数中间的数本来不应该选但是最后选上的错误)

例如:

 

当单步运行的时候如果到了 选10,然后它会继续堆zhai,然后出zhai,如果取17过后,再复原的时候,3对应的类型就会变成 false,所以也就会把3选上 但是这样是不对的。所以,我们要利用整形的数组。

 接下来的难点就是怎样去遍历了,这一点没啥好说的  因为我也是看题解的。题解大佬是 先对列进行遍历,然后换行,到最后一个点的时候就返回。

 

接下来就是  对于每个数  取和不取的两种状态:

 

完整的代码如下:

#include<iostream>
#include<math.h>
using namespace std;
int a[8][8];
int b[8][8];
int p,q;
const int d[8][2]={1,0,-1,0,0,1,0,-1,1,1,-1,1,1,-1,-1,-1};
//int d_x[8] = {0,0,1,1,1,-1,-1,-1};
//int d_y[8] = {1,-1,0,1,-1,0,-1,1};
int sum,sm;
int max(int x,int y)
{
    return (x > y) ? x : y;
}
void dfs(int m,int n){
    if(n == q+1)
    {
        dfs(m+1,1);
        return;
    }
    if(m == p+1)
    {
        sum = max(sum,sm);
        return;
    }
    dfs(m,n+1);             // 不取数字
    if(b[m][n] == 0){                         //不能用布尔数组  会重叠
        sm += a[m][n];
        for(int i = 0;i < 8;i++){
            b[m + d[i][0]][n + d[i][1]]++;
        }
        dfs(m,n+1);         //取这个数字
        sm -= a[m][n];
        for(int i = 0;i < 8;i++){
            b[m + d[i][0]][n + d[i][1]]--;
        }
    }
}
int main(){
    int n;
    cin>>n;
    while(n--){
        cin>>p>>q;
        for(int i = 1;i <= p;i++)
            for(int j = 1;j <= q;j++)
                 cin>>a[i][j];
        sum = 0;
        dfs(1,1);
        cout<<sum<<endl;
    }
    return 0;
}

okok  加油小灰灰   加油!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

标签:洛谷,int,题解,sum,dfs,取数,++,sm
From: https://www.cnblogs.com/fighting-huihui/p/17064104.html

相关文章

  • AT_abc286d 题解
    板子首先我们看到值域并不大。因此可以维护值域,跑完全背包。具体而言维护某一个值(小于\(10000\))是否能被凑出来,然后枚举物品种类以及物品数量即可。一般而言,完全背包......
  • AT_abc286e 题解
    首先观察到\(n\leq300\)加上全源“最短路”便可以自然而然的想到floyd。注意到floyd算法的可行性只依赖统计的东西具有优先级。这里我们定义优先级为最短路最短且......
  • ABC286 A-E题解
    题目虽然是大年三十,但是玩手机没写题有意思。从50分钟才开始看题。A题意:将数组中\([p,q]\)与\([r,s]\)的元素交换并输出。sbt。B大意:将字符中的na换成nya。......
  • AcWing 第87场周赛题解
    T1移动棋子算出为\(1\)的点离\((3,3)\)的距离即可。#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;intmain(){int......
  • LeetCode.面试题02.05-链表求和-题解分析
    题目来源面试题02.05.链表求和题目详情给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并......
  • Codeforces Round48 Edu题解
    A-DeathNote(模拟)题意​ 现在有一本书,每页可以写下\(m\)个数字,给你一个序列\(a\),依次在书上誊写\(a_i\)个数字,请问誊写序列的第\(i\)个数的时候书翻了几页?​ ......
  • HGAME 2023 Week2 Pwn YukkuriSay题解
    HGAME2023Week2PwnYukkuriSay题解检查保护:拿到文件先checksec一下:64位程序,开启canary和nx保护,没有开启PIE(可以使用绝对地址了)继续往下看,先不着急打开ida,我们先运......
  • GoodBye Renyin ABC题解
    GoodByeRenyinABC题解A答案为\(\text{YES}\)的充要条件是\(\max(a_i)\timesr\le(\suma_i-\max(a_i))\timesR\)。必要性显然。充分性是可以先把最大的放在\((......
  • 博客园美化及markdown代码问题解决
    博客园美化Cnblogs-Theme-SimpleMemory代码出处GitHub-BNDong/Cnblogs-Theme-SimpleMemoryatv1.2.6说明文档:简介-Document(bndong.github.io)如果无法进入网站,......
  • Deque 题解
    题目传送门一道区间\(dp\)题。在\(dp\)之前,我们需要明确以下几个东西:状态的表示,状态转移方程,边界条件跟答案的表示。状态的表示定义\(sum(l,r)=\sum_{i=l}^ra_......