首页 > 其他分享 >【搜索】洛谷P1123 取数游戏

【搜索】洛谷P1123 取数游戏

时间:2025-01-17 22:56:39浏览次数:1  
标签:cnt 洛谷 int dfs st 取数 ++ P1123 AcWing

P1123 取数游戏
搜索顺序:按格子枚举。
思想类比AcWing 843. n-皇后问题按格子枚举方法,以及
AcWing 1116. 马走日
AcWing 1117. 单词接龙
AcWing 1118. 分成互质组
,体会恢复现场写在for循环内部与写在for循环外部的区别。
最大的区别:恢复现场写在for循环外可以不用清空标记数组。恢复现场写在for循环内,则对于每组数据必须清空标记数组

参考链接:
https://www.acwing.com/activity/content/code/content/134135/
https://www.acwing.com/solution/content/6033/


C++代码

#include <iostream>
#include <cstring>

using namespace std;

const int N = 10;

int n, m, T, cnt, ans;
int g[N][N], st[N][N];
int dx[8] = {1, 1, 1, 0, -1, -1, -1, 0};
int dy[8] = {1, 0, -1, -1, -1, 0, 1, 1};

void dfs(int x, int y)
{
    if (y == m) y = 0, x++;//m列,y==m到达列末尾
    if (x == n)
    {
        ans = max(ans, cnt);
        return;
    }
    //不选此数
    dfs(x, y + 1);
    //选此数
    if (st[x][y] == 0)
    {
        cnt += g[x][y];
        for (int i = 0; i < 8; i++)
        {
            int a = x + dx[i], b = y + dy[i];
            if (a < 0 || a >= n || b < 0 || b >= m) continue;
            st[a][b]++;
        }
        dfs(x, y + 1);
        
        for (int i = 0; i < 8; i++) //恢复现场
        {
            int a = x + dx[i], b = y + dy[i];
            if (a < 0 || a >= n || b < 0 || b >= m) continue;
            st[a][b]--;
        }
        cnt -= g[x][y];
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    cin >> T;
    while (T--)
    {
        // 恢复现场在for循环外,可以不清空st,因为恢复现场会清空
        // memset(st, 0, sizeof st);
        cin >> n >> m;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                cin >> g[i][j];

        ans = 0;
        dfs(0, 0);
        cout << ans << '\n';
    }
    return 0;
}

标签:cnt,洛谷,int,dfs,st,取数,++,P1123,AcWing
From: https://www.cnblogs.com/Tshaxz/p/18677778

相关文章

  • 【洛谷P1303】高精度乘法
    A*BProblem题目背景高精度乘法模板题。题目描述给出两个非负整数,求它们的乘积。输入格式输入共两行,每行一个非负整数。输出格式输出一个非负整数表示乘积。样例#1样例输入#112样例输出#12提示每个非负整数不超过10^{2000}。入坑OI这么久发现还没有写过......
  • 【洛谷训练记录】【LGR-213-Div.4】洛谷入门赛 #31
    训练情况赛后反思模拟题差点红温,差一道字符串模拟题AKA题问一个数\(a\)加多少后的个位数变成\(b\),取出\(a\)的个位数,再用\(b\)去减,如果小于零答案再加十。#include<bits/stdc++.h>//#defineintlonglong#defineendl'\n'usingnamespacestd;voidsolve()......
  • 洛谷P1803
    凌乱的yyy/线段覆盖-洛谷代码区:#include<stdio.h>#include<stdlib.h>structGAME{ intstart; intend;};intcmp(constvoid*a,constvoid*b){ structGAME*game1=(structGAME*)a; structGAME*game2=(structGAME*)b; returngame1->end-game2->......
  • 洛谷题单指南-线段树的进阶用法-P3168 [CQOI2015] 任务查询系统
    原题链接:https://www.luogu.com.cn/problem/P3168题意解读:一个任务管理系统,能够查询在某个时间点运行的任务中优先级最小的k个任务的优先级之和。解题思路:由于总时间n不超过100000,考虑针对所有时刻建立可持久化线段树,根节点为root[i]的线段树维护时刻i的任务情况,节点区间表示......
  • 洛谷题单指南-线段树的进阶用法-P2617 Dynamic Rankings
    原题链接:https://www.luogu.com.cn/problem/P2617题意解读:动态求区间第k小问题。解题思路:树套树的典型应用,具体阐述参考:https://www.cnblogs.com/jcwy/p/18640914100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=100005;structOp{charop;......
  • 每日一题洛谷P5726 【深基4.习9】打分C++
    #include<iostream>#include<iomanip>usingnamespacestd;intmain(){ intn; cin>>n; intstr[1000]={0}; intmax=0; intmin=10; for(inti=0;i<n;i++){ cin>>str[i]; if(str[i]>max){ max=str[i......
  • 洛谷P1319
    压缩技术-洛谷代码区:#输入lst=list(map(int,input().split()))#n的值n=lst[0]#lists全部初始化为0lists=[0]*(n**2)lst=lst[1:]#索引index=-1foriinrange(len(lst)):#下标为奇数的索引直接加上ifi%2==0:index+=lst[i]#下标为奇数......
  • 洛谷 P8469 [Aya Round 1 D] 文文的数学游戏 C语言
    题目:P8469[AyaRound1D]文文的数学游戏-洛谷|计算机科学教育新生态题目背景在解决了上一题之后,琪露诺觉得自己仿佛就是天才。于是,射命丸文又给了她一道简单的数学题。题目描述给定长度为 n 的整数序列 a,你需要构造一个长度为 n 的整数序列 b 满足对于所有......
  • gesp(C++五级)(5)洛谷:B3929:[GESP202312 五级] 小杨的幸运数
    gesp(C++五级)(5)洛谷:B3929:[GESP202312五级]小杨的幸运数题目描述小杨认为,所有大于等于aaa的完全平方数都是他的超级幸运数。小杨还认为,所有超级幸运数的倍数都是他......
  • gesp(C++五级)(6)洛谷:B3930:[GESP202312 五级] 烹饪问题
    gesp(C++五级)(6)洛谷:B3930:[GESP202312五级]烹饪问题题目描述有NNN种食材,编号从00......