算法day4 dfs搜索2題

一? 糖果

我們看這個藍橋A組真題
首先我們看這個題目說有M種的糖果,K顆一包,N包糖果
第一行就是輸入M,K,N的數量
后面就是輸入每個糖果在每包里面的種類
然后問我們最少要用幾包糖果才可以把所有種類的糖果都吃一遍
如果不可以吃完所有種類的糖果,就直接返回-1

當我在競賽場上一定要冷靜,思考這個題目是屬于什么類型的
很顯然,這個糖果有一個選和不選,那么就可以快速想到這個dfs來解決,如果不行的話就優化代碼,可以去看這篇文章里面很詳細的講述優化算法 狀態dp-CSDN博客

然后我們先來想一下這個怎么寫
首先這里有很多的糖果,每個糖果只有選擇和不選擇,就像二叉樹一樣,那么遞歸也就只有兩層,一個用于左子樹,一個用于右子樹,這兩個遞歸分別代表選擇和不選擇
然后我們就再進行分析,搞定了遞歸的話,那么我后面就要搞定條件了
題目給的限制條件是要吃完所有的糖果類型,那么我們可以用一個狀態數組來實現這個種類的糖果到底吃沒吃,這樣就可以知道到底有沒有吃完所有的糖果了

我們來實現一下
代碼都是作者自己敲出來的,如果有更好的代碼,歡迎大家指出

#include<bits/stdc++.h>
#include<cstring>
#include<unordered_map>
using namespace std;
const int N = 110;
int n,m,k;       //包數,種類,幾個一包
int candy[N][N];
bool st[N];      //標記對飲糖果的種類
int mincount=1e6;bool judge(){for(int i=1;i<=m;i++){if(!st[i])return false;}return true;
}//x表示當前包
void dfs(int x,int count){//減枝if(count>mincount) return ;if(x>n){if(judge()){mincount=min(mincount,count);}return ;}// 選擇當前包bool temp[N];  // 臨時保存 st 的狀態memcpy(temp, st, sizeof(st));  // 保存當前狀態for (int i = 1; i <= k; i++) {st[candy[x][i]] = true;}dfs(x + 1, count + 1);// 恢復 st 的狀態memcpy(st, temp, sizeof(temp));//不選擇dfs(x+1,count);
}int main(){scanf("%d %d %d",&n,&m,&k);memset(candy,0,sizeof(candy));for(int i=1;i<=n;i++){for(int j=1;j<=k;j++){scanf("%d",&candy[i][j]);}}dfs(1,0);if(mincount==1e6){printf("-1\n");return 0;}printf("%d\n",mincount);return 0;
}

?首先這個輸入就沒有必要說了,來說說這個dfs,首先這個dfs我一開始是犯了一個很嚴重的錯誤的,就是這個糖果的狀態判斷

//選擇//增添對這個糖果的標記for(int i=1;i<=k;i++){st[candy[x][i]]=true;}dfs(x+1,count+1);//取消對這個口味的標記for(int i=1;i<=k;i++){st[candy[x][i]]=false;}//不選擇dfs(x+1,count);

這個是我之前的寫的代碼
我當時是想著如果回溯就恢復原來的狀態,但是我們忽略了還有之前已經找過的糖果狀態是true,我這里設置全是true,所以會導致結果不對,后來才想到這個是需要上一次的狀態的,所以這里就直接用了一個臨時的數組來存儲臨時的狀態,當回溯的時候就直接返回這個狀態就好了,這個題目主要是難在這個狀態我們該怎么去設置,dfs不難
?

二? 入門
?

我們來看這種帶有迷宮性質的,我們不適用廣度優先搜索,使用dfs該怎么解決

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;const int N = 30;
int w, h;        // 寬度和高度
int res;         // 結果
char map[N][N];  // 地圖
bool st[N][N];   // 狀態int ax[] = {-1, 0, 1, 0};
int ay[] = {0, 1, 0, -1};void dfs(int x, int y) {for (int i = 0; i < 4; i++) {int a = x + ax[i];int b = y + ay[i];// 邊界條件if (a >= h || a < 0 || b >= w || b < 0) continue;if (map[a][b] == '#') continue;if (st[a][b]) continue;st[a][b] = true;res++;dfs(a, b);}
}int main() {scanf("%d %d", &w, &h);  // 注意順序:寬度 w,高度 hfor (int i = 0; i < h; i++) {scanf("%s", map[i]);  // 按行讀取地圖}for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {if (map[i][j] == '@') {st[i][j] = true;  // 標記起點為已訪問res = 1;          // 初始化結果,包括起點dfs(i, j);        // 開始 DFSbreak;            // 找到起點后退出循環}}}printf("%d", res);  // 輸出結果return 0;
}

首先這個具有方向性質的首先就是考慮用向量數組,這樣就可以幫助我們去移動,然后這個也有三個條件
1? 不可以越界
2? 遇到#要進行不走
3? 走過的路不走
所以把握了這個很簡單就可以寫出來了
?


總結

首先我們現在越來越熟練這個dfs了,然后還熟悉記憶化搜索和剪枝的操作
這些都是十分重要對于搜索類型的題目,所以我們就要好好掌握
這里蘊含了兩個條件
首先就是方向的移動
其次就是有沒有拿過和有沒有走過這些狀態,這些狀態是要用數組記錄下來去使用的我們可以使用循環,也可以使用很多的方法,所以if和for這里面很重要
遞歸,for,if組成就構成了搜索

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72237.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72237.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72237.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【MySQL】窗口函數詳解(概念+練習+實戰)

文章目錄 前言1. SQL窗口函數 1.1 窗口函數概念1.2 窗口函數語法1.3 常見窗口函數 1.3.1 聚合窗口函數1.3.2 專用窗口函數 1.4 窗口函數性能比較 2. LeetCode 例題 2.1 LeetCode SQL 178&#xff1a;分數排名2.2 LeetCode SQL 184&#xff1a;最高工資2.3 LeetCode SQL 185&am…

【Ai】--- DeepSeek-r1 如何選擇適合自己的版本(超詳細)

在編程的藝術世界里&#xff0c;代碼和靈感需要尋找到最佳的交融點&#xff0c;才能打造出令人為之驚嘆的作品。而在這座秋知葉i博客的殿堂里&#xff0c;我們將共同追尋這種完美結合&#xff0c;為未來的世界留下屬于我們的獨特印記。 【Ai】--- DeepSeek-r1 如何選擇適合自己…

植物大戰僵尸金鏟鏟版 v1.1.6(windows+安卓)

游戲簡介 《植物大戰僵尸金鏟鏟版》是由“古見xzz”、“對不起賤笑了”、“是怪哉吖”等聯合開發的民間魔改版本&#xff0c;融合了原版塔防玩法與《金鏟鏟之戰》的自走棋元素&#xff0c;屬于非官方同人作品。 游戲特點 合成升星機制&#xff1a;三個相同低星植物可合成更高…

網絡空間安全(6)web應用程序技術

前言 Web應用程序技術是指用于開發和構建基于Web的應用程序的技術和工具&#xff0c;涵蓋了前端開發、后端開發、數據庫管理、安全性等多個方面的技術。 一、前端開發技術 HTML/CSS/JavaScript&#xff1a;HTML用于構建網頁結構&#xff0c;CSS用于進行樣式設計&#xff0c;Jav…

零基礎學習OpenGL(一)創建一個窗口

基于 ubuntu 系統&#xff0c;設置基礎環境。 #!/usr/bin/env bashsudo apt-get update# 安裝基礎編譯軟件 sudo apt-get -y install gcc g cmake git# 安裝編譯 glfw 依賴的軟件 sudo apt-get -y install libwayland-dev libx11-dev libxcursor-dev libxi-dev libxinerama-de…

Windows 11 下正確安裝 Docker Desktop 到 D 盤的完整教程

文章目錄 Windows 11 在 D 盤正確安裝 Docker Desktop 的完整教程**前言****準備工作****1. 手動創建 Docker 相關目錄**&#xff08;?? **這一步非常重要**&#xff0c;否則會報錯&#xff09;**2. 下載 Docker Desktop 安裝程序****3. 使用管理員權限打開終端** **安裝 Doc…

版圖自動化連接算法開發 00001 ------ 直接連接兩個給定的坐標點

版圖自動化連接算法開發 00001 ------ 直接連接兩個給定的坐標點 引言正文定義坐標點的類繪圖顯示代碼直接連接兩個坐標點引言 由于人工智能的加速普及,每次手動繪制版圖都會覺得特別繁瑣,作者本人在想可否搞一個自動化連接器件端口的算法,后期可以根據一些設定的限制進行避…

AIP-156 單例資源

編號156原文鏈接AIP-156: Singleton resources狀態批準創建日期2019-05-12更新日期2024-04-15 API有時需要表示在任意上級資源中&#xff0c;始終只存在一個實例的資源。常見的例子是配置對象。 指南 API 可以 定義 單例資源 。單例資源 必須 始終隨上級資源而存在&#xff…

程序詩篇里的靈動筆觸:指針繪就數據的夢幻藍圖(水文,勿三)

大家好啊&#xff0c;我是小象?(?ω?)? 我的博客&#xff1a;Xiao Xiangζ????? 很高興見到大家&#xff0c;希望能夠和大家一起交流學習&#xff0c;共同進步。 這一節我們來學習指針的相關知識&#xff0c;學習內存和地址&#xff0c;指針變量和地址&#xff0c;包…

【實用技巧】RAGFlow+DeepSeek搭建私人Ai助理

前言 滿血版DeepSeek雖然很好用&#xff0c;但仍然有三個主要缺陷&#xff1a; 聯網的DeepSeek無法解決數據安全問題&#xff0c;如果使用&#xff0c;數據將傳輸到其服務器&#xff0c;數據隱私性無法保證。上傳的文件存在限制&#xff0c;無法解決有多個文件的問題。回答的…

Storm實時流式計算系統(全解)——中

storm編程的基本概念-topo-spout-bolt 例如下&#xff1a; storm 編程接口-spout的結構及組件實現 storm編程案例-spout組件-實現 這是我的第一個組件&#xff08;spout組件繼承BaseRichSput&#xff09;所有重寫內部的三個方法&#xff0c;用于接收數據&#xff08;這里數據是…

【tplink】校園網接路由器如何單獨登錄自己的賬號,wan-lan和lan-lan區別

老式路由器TPLINK&#xff0c;接入校園網后一人登錄&#xff0c;所有人都能通過連接此路由器上網&#xff0c;無法解決遂上網搜索&#xff0c;無果&#xff0c;幸而偶然看到一個帖子說要把信號源網線接入路由器lan口&#xff0c;開啟新世界。 一、wan-lan&#xff0c;lan-lan區…

Qt常用控件之旋鈕QDial

旋鈕QDial QDial 表示一個旋鈕控件。 1. QDial屬性 屬性說明value當前數值。minimum最小值。maximum最大值。singleStep按下方向鍵時改變的步長。pageStep按下 pageUp/pageDown 的時候改變的步長。sliderPosition界面上旋鈕顯示的初始位置。tracking外觀是否會跟蹤數值變化&…

微服務筆記 2025/2/15

微服務是一種軟件架構風格&#xff0c;它是以專注于單一職責的很多小型項目為基礎&#xff0c;組合出復雜的大型應用。 微服務是一種架構。 微服務是一種架構。 微服務是一種架構。 以前自己做項目最常用的架構是單體架構。單體項目不適合開發大型項目。 學習微服務技術來解…

7-1JVMCG垃圾回收

一、GC的作用與原理 ?核心功能? 自動識別并回收堆內存中不再被引用的對象&#xff0c;釋放內存空間。 避免手動管理內存的復雜性&#xff08;如C/C中的delete/free操作&#xff09;&#xff0c;降低內存泄漏風險。 ?判斷對象可回收的方法? ?可達性分析算法&#xff1a;…

yunedit-post ,api測試比postman更好

postman應該是大家最熟悉的api測試軟件了&#xff0c;但是由于它是外國軟件&#xff0c;使用它的高端功能注冊和繳費都比較麻煩。生成在線文檔分享也經常無法訪問被攔截掉。 這里可以推薦一下yunedit-post&#xff0c;該有的功能都有。 https://www.yunedit.com/postdetail …

010 rocketmq批量消息

文章目錄 批量消息BatchProducer.javaBatchConsumer.java 批量消息 批量發送可以提?發送性能&#xff0c;但有?定的限制&#xff1a; topic 相同 waitStoreMsgOK 相同 &#xff08;?先我們建設消息的iswaitstoremsgoktrue(默認為true), 如果沒有異常,我們將始終收到"O…

6.6.6 嵌入式SQL

文章目錄 2個核心問題識別SQL語句主語言和SQL通信完整導圖 2個核心問題 SQL語句嵌入高級語言需要解決的2個核心問題是&#xff1a;如何識別嵌入語句&#xff1f;如何讓主語言&#xff08;比如C,C語言&#xff09;和SQL通信&#xff1f; 識別SQL語句 為了識別主語言中嵌入的SQL…

Windows安裝sql server2017

看了下官網的文檔&#xff0c;似乎只有ubuntu18.04可以安裝&#xff0c;其他debian系的都不行&#xff0c;還有通過docker的方式安裝的。 雙擊進入下載的ISO&#xff0c;點擊執行可執行文件&#xff0c;并選擇“是” 不要勾選 警告而已&#xff0c;不必理會 至少勾選這兩…

RuoYi框架介紹,以及如何基于Python使用RuoYi框架

若依框架&#xff08;RuoYi&#xff09;是一款基于Spring Boot和Vue.js的開源快速開發平臺&#xff0c;廣泛應用于企業級應用開發。它提供了豐富的功能模塊和代碼生成工具&#xff0c;幫助開發者快速搭建后臺管理系統。 主要特點 前后端分離&#xff1a;前端采用Vue.js&#x…