国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

藍(lán)橋杯---第一講 遞歸與遞推

這篇具有很好參考價(jià)值的文章主要介紹了藍(lán)橋杯---第一講 遞歸與遞推。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


前言

本篇博客主要打卡記錄博主學(xué)習(xí)藍(lán)橋杯C++AB組輔導(dǎo)課的習(xí)題第一章節(jié)的題目。


Ⅰ. 遞歸實(shí)現(xiàn)指數(shù)型枚舉

0x00 算法思路

這一道題主要考查 dfs 算法,然后這一道題就是以位置來進(jìn)行 搜索 當(dāng)搜索到最后一個(gè)位置的時(shí)候就可以 收獲結(jié)果 然后考慮枚舉到的位置 可以選擇 或者 不選

0x00 代碼書寫

#include<bits/stdc++.h>

using namespace std;

const int N = 16;

int n;
int st[N]; // 狀態(tài),記錄每個(gè)位置當(dāng)前的狀態(tài):0表示還沒考慮,1表示選,2表示不選 

void dfs(int u)
{
	if(u > n)
	{
		for(int i = 1 ; i <= n ; ++ i)
			if(st[i] == 1)
				cout << i << " ";
		cout << endl;
		return;
	}
	
	//不選
	st[u] = 2;
	dfs(u + 1);
	st[u] = 0; //注意恢復(fù)現(xiàn)場(chǎng) 
	
	//選
	st[u] = 1;
	dfs(u + 1); 
	st[u] = 0; //注意恢復(fù)現(xiàn)場(chǎng)
	
}

int main()
{	
	cin >> n;
	
	dfs(1); //枚舉第一個(gè)位置 
	
	return 0;
}

0x00 思考總結(jié)

這一道題目 就是枚舉每一個(gè)位置,然后進(jìn)行選這個(gè)數(shù)字或者不選這個(gè)數(shù)字,當(dāng)枚舉到末尾的時(shí)候就可以進(jìn)行收獲(打印結(jié)果) —> 本質(zhì)就是枚舉每一個(gè)位置然后根據(jù)選或不選進(jìn)行的排列組合

Ⅱ. 遞歸實(shí)現(xiàn)排列型枚舉

0x00 算法思路

利用一個(gè)判斷數(shù)組st數(shù)組,檢查是否這個(gè)位置的數(shù)字我已經(jīng)使用過了,如果使用過了,就繼續(xù),如果沒有就直接放到a數(shù)組里,遞歸下一個(gè)位置

0x01代碼書寫

#include<bits/stdc++.h>

using namespace std;

const int N = 11;

int n;
int st[N];//記錄這個(gè)數(shù)字是否被使用過false表示沒有,true表示用過
int a[N];//存放數(shù)字 方便打印

void dfs(int u)
{
	if(u > n)//(u == n + 1)也是可以的表示枚舉到最后一個(gè)位置
	{
		for(int i = 1 ; i <= n; ++ i)
			cout << a[i] << " ";
		cout << endl;
		return; 	
	}
	
	for(int i = 1 ; i <= n ; ++ i)
	{
		if(st[i] == false)
		{
			a[u] = i;
			st[i] = true;
			dfs(u + 1);
			st[i] = false; //恢復(fù)現(xiàn)場(chǎng)
		}
	}
	return;
}

int main()
{	
	cin >> n;
	
	dfs(1); //枚舉第一個(gè)位置 
	
	return 0;
}

0x02 思考總結(jié)

對(duì)比上一道題目,上一道是根據(jù)選或不選來進(jìn)行排列組合,這一道題目則是根據(jù)n的位置的多少進(jìn)行排列組合,這里面用到了一個(gè) st 數(shù)組來判斷這一個(gè)數(shù)字是否被使用過,從而對(duì)這n個(gè)位置的數(shù)字進(jìn)行排列組合

Ⅲ. 簡(jiǎn)單斐波那契

0x00 算法思路

簡(jiǎn)單的遞推公式問題

0x01 代碼書寫

#include <iostream>
using namespace std;
int main()
{
    int n;
    cin >> n;

    int a = 0, b = 1;

    for (int i = 0; i < n; i ++ )
    {
        cout << a << ' ';
        int c = a + b;
        a = b;
        b = c;
    }

    cout << endl;

    return 0;
}

Ⅳ. 費(fèi)解的開關(guān)

0x00 算法思路

暴力枚舉第一行的32—>2的5次方 種情況,然后去統(tǒng)計(jì)第一行的五位01串中出現(xiàn)1的數(shù)量然后進(jìn)行turn和step++,
然后枚舉除了最后一行的前面四行,遇到 ‘0’ 就可以對(duì) i + 1 行 j 列 進(jìn)行 turn 操作,從而使得 i,j 這個(gè)位置的燈改變成亮。
最后去橫掃最后一行,看是否有黑的燈,如果有的話,代表我們的操作是無法完成任務(wù)的,所以 輸出-1
當(dāng)發(fā)現(xiàn)沒有黑的時(shí)候,就可以取最小值進(jìn)行迭代了。

這里復(fù)制粘貼一下Acwing上邊的疑惑講解:
1.高票題解代碼中的 if (k >> j & 1) 究竟什么意思?

其中,k保存的根本就不是第一行的燈所有可能的狀態(tài),不然它第j位都為1了還按它干嘛? k單純只是保存了第一行按開關(guān)的32種方式,與輸入數(shù)據(jù)無關(guān)。

且大多數(shù)題解代碼中都規(guī)定了k在二進(jìn)制下某位為1就代表我們選擇按下這一位所在編號(hào)的開關(guān),你也可以自己規(guī)定k在二進(jìn)制下某位為0才代表我們選擇按下這一位所在編號(hào)的開關(guān),這都無所謂。

比如k在二進(jìn)制下表示為10001,就代表我們選擇按第一行編號(hào)為0和編號(hào)為4的開關(guān),然后對(duì)輸入數(shù)據(jù)中第一行這兩位執(zhí)行turn操作。
貼一個(gè)Acwing大佬寫的超級(jí)詳細(xì)的題解
AcWing 95. 費(fèi)解的開關(guān)(有圖超詳細(xì),看不懂揍我)

0x01 代碼書寫

#include<bits/stdc++.h>

using namespace std;

const int N = 6;

char g[N][N], backup[N][N];
int dx[5] = {-1,0,1,0,0}, dy[5] = {0,1,0,-1,0};

void turn(int x,int y)//dfs--->迷宮類模板
{
	for(int i = 0 ; i < 5 ; ++ i)
	{
		int a = x + dx[i], b = y + dy[i];
		if(a < 0 || a >= 5 || b < 0 || b >= 5) continue;
		g[a][b] ^= 1;
	}
}

int main()
{	
	int T;
	cin >> T;
	
	while(T -- )
	{
		for(int i = 0 ; i < 5 ; ++ i)
			for(int j = 0 ; j < 5 ; ++ j)
				cin >> g[i][j];
		
		int res = 10;
		
		for(int op = 0 ; op < 32 ; ++ op)
		{
			memcpy(backup, g , sizeof g);
			int step = 0;
			for(int i = 0 ; i < 5 ; ++ i)
				if(op >> i & 1)
				{
					step ++;
					turn(0, i);
				}
			
			for(int i = 0 ; i < 4 ; ++ i)
				for(int j = 0 ; j < 5 ; ++ j)//對(duì)黑的燈進(jìn)行turn操作
					if(g[i][j] == '0')
					{
						step ++;
						turn(i + 1 , j);
					}
			bool dark = false;
			for(int i = 0 ; i < 5 ; ++ i)//遍歷最后一行看是否存在黑著的燈
				if(g[4][i] == '0')
				{
					dark = true;
					break;
				}
				
			if(!dark) res = min(res,step);
			memcpy(g, backup, sizeof g);
		}
		if(res > 6) res = -1;
		cout << res << endl;
	}
		
	return 0;
}

Ⅴ. 遞歸實(shí)現(xiàn)組合型枚舉

0x00 算法思路

通過枚舉第一個(gè)位置和開始的數(shù)進(jìn)行dfs操作,當(dāng)搜索到最后一個(gè)位置的時(shí)候就可以收獲結(jié)果了

0x01 代碼書寫

#include<bits/stdc++.h>

using namespace std;

const int N = 30;

int n, m;
int st[N];


void dfs(int u, int start)
{
	if(u == m + 1)
	{
		for(int i = 1 ; i <= m ;  ++ i)
			cout << st[i] << " ";
		cout << endl;
		return; 
	}
	
	for(int i = start ; i <= n ; ++ i)
	{
		st[u] = i;
		dfs(u + 1, i + 1);
		st[u] = 0;
	}
}

int main()
{	
	cin >> n >> m;
	
	dfs(1, 1); //枚舉第一個(gè)位置 
	
	return 0;
}

Ⅵ. 帶分?jǐn)?shù)

0x00 算法思路

根據(jù) n = a + b / c 變換 成為 : cn = ac + n所以可以先確定ac的值進(jìn)而確定b的值所以有以下思路:

  1. 枚舉a的數(shù)值
  2. 枚舉c的數(shù)值
  3. 判斷b是否符合條件

這個(gè)題目也用到了全排列的思想—>本節(jié)的第二道題目就是全排列題目的代碼和思路

0x01 代碼書寫

#include<bits/stdc++.h>

using namespace std;

const int N = 10;

int n;
bool st[N],backup[N];
int ans;

bool check(int a,int c)
{
	long long b = n * (long long)c - a * c;//防止溢出用long long
	memcpy(backup,st,sizeof st);//用備份操作
	
	if(!a || !b || !c) return false;
	
	while(b)//判斷b當(dāng)中的數(shù)字是否被使用過了已經(jīng)
	{
		int x = b % 10;
		b /= 10;
		if(!x || backup[x]) return false;//被使用過了就返回false
		backup[x] = true;
	}
	
	for(int i = 1 ; i <= 9 ; ++ i)//最后再對(duì)abc三個(gè)數(shù)字所選的數(shù)字看看是否選完了0~9個(gè)數(shù)字
		if(!backup[i])
			return false;
	return true;
}

void dfs_c(int u, int a ,int c)
{
	if(u > 9) return; //超過9個(gè)數(shù)就可以return
	
	if(check(a,c)) ans ++; //發(fā)現(xiàn)組合就可以 ++ans
	
	for(int i = 1 ; i <= 9 ; ++ i)//去確定c的值
	{
		if(!st[i])
		{
			st[i] = true;
			dfs_c(u + 1,a, c * 10 + i);
			st[i] = false;
		}
	}
}

void dfs_a(int u , int a)
{
	if(a >= n) return; //a不能大于n
	if(a) dfs_c(u,a,0);//a不能是0 然后去找c
	
	for(int i = 1 ; i <= 9 ; ++ i)//去確定a的值
	{
		if(!st[i])
		{
			st[i] = true;
			dfs_a(u + 1,a * 10 + i);
			st[i] = false;
		}
	}
	return;
}

int main()
{
	cin >> n;
	
	dfs_a(0, 0);// 去遞歸搜索 a 一開始選0個(gè)數(shù)字(用了多少個(gè)數(shù)),a是0。
	
	cout << ans << endl;
	
	return 0;
}

Ⅶ. 飛行員兄弟

0x00 算法思路

先說結(jié)論,在判斷是否要對(duì)(i, j)位置的把手進(jìn)行切換時(shí),只需要計(jì)算一下第i行和第j列總共7個(gè)把手(以下稱為(i, j)對(duì)應(yīng)的十字)中閉合的把手?jǐn)?shù)目,如果是奇數(shù)個(gè)就進(jìn)行切換,偶數(shù)個(gè)就不進(jìn)行切換。(奇數(shù)個(gè)是該位置的把手進(jìn)行過切換的充要條件)

因此我們從上到下從左到右順次的對(duì)16個(gè)把手進(jìn)行上述判斷。如果判斷結(jié)果是奇數(shù)個(gè)那么說明該位置被切換過,進(jìn)行記錄即可。

0x01 代碼書寫

#include<bits/stdc++.h>

using namespace std;

#define x first
#define y second

const int N = 5;
typedef pair<int,int> PII;
char g[N][N], backup[N][N];

int get(int x, int y)
{
    return x * 4 + y;
}

void turn_one(int x, int y)
{
    if (g[x][y] == '+') g[x][y] = '-';
    else g[x][y] = '+';
}

void turn_all(int x, int y)
{
    for (int i = 0; i < 4; i ++ )
    {
        turn_one(x, i);
        turn_one(i, y);
    }

    turn_one(x, y);
}

int main()
{
	for(int i = 0 ; i < 4 ; ++ i) cin >> g[i];
	
	vector<PII> res;
	
	for(int op = 0 ; op < 1 << 16 ; ++ op)
	{
		vector<PII> temp;
		memcpy(backup, g ,sizeof g);
		
		for(int i = 0 ; i < 4 ; ++ i)
			for(int j = 0 ; j < 4 ; ++ j)
			{
				if(op >> get(i, j) & 1)
				{
					temp.push_back({i, j});
					turn_all(i, j);
				}
			}
		
		bool has_closed = false;
		for(int i = 0 ; i < 4 ; ++ i)
			for(int j = 0 ; j < 4 ; ++ j)
			{
				if(g[i][j] == '+')
					has_closed = true;
			}
		
		if(has_closed == false) 
			if(res.empty() || res.size() > temp.size()) res = temp;
		
		memcpy(g,backup,sizeof g);
	}
	cout << res.size() << endl;
	for(auto& op : res) cout << op.x + 1 << " " << op.y + 1 << endl;
	
	return 0;
}

Ⅷ. 翻硬幣

0x00 算法思路

將硬幣和目標(biāo)的樣子進(jìn)行比較,當(dāng)發(fā)現(xiàn)不一樣的時(shí)候就進(jìn)行 turn 翻轉(zhuǎn)即可

0x01 代碼書寫

#include<bits/stdc++.h>

using namespace std;

const int N=110;
char start[N], aim[N];
int n;

void turn(int i)
{
    if(start[i]=='o') start[i]='*';
    else start[i]='o';
}

int main()
{
    cin >> start >> aim;

    n = strlen(start);

    int res=0;
    for(int i = 0; i < n - 1 ; i ++)
    {
        if(start[i] != aim[i])
        {
            turn(i), turn(i+1);
            res ++;
        }
    }

    cout << res << endl;

    return 0;
}

總結(jié)

本篇博客主要講解了遞推與遞歸的算法,也涉及到了 dfs 搜索算法的使用,其實(shí) dfs 算法可以

  1. 先去想dfs的含義,參數(shù)的含義
  2. 找到dfs的結(jié)束條件進(jìn)行收獲結(jié)果
  3. 根據(jù)題目要求實(shí)現(xiàn)dfs代碼

希望自己可以多多練習(xí),后面藍(lán)橋杯輔導(dǎo)課看完就會(huì)去看算法提高課繼續(xù)提升文章來源地址http://www.zghlxwxcb.cn/news/detail-719851.html

到了這里,關(guān)于藍(lán)橋杯---第一講 遞歸與遞推的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 自動(dòng)曝光算法(第一講)

    自動(dòng)曝光算法(第一講)

    失業(yè)在家無事,想到以后換方向不做自動(dòng)曝光了,但是自動(dòng)曝光的工作經(jīng)驗(yàn)也不能浪費(fèi)了,準(zhǔn)備寫一個(gè)自動(dòng)曝光的教學(xué),留給想做自動(dòng)曝光的小伙伴參考。筆者當(dāng)時(shí)開發(fā)自動(dòng)曝光沒有按攝影的av+tv=ev=bv+sv公式弄,而是按正確的增益=目標(biāo)亮度/當(dāng)前亮度*當(dāng)前增益的公式去開發(fā)。

    2024年02月06日
    瀏覽(19)
  • 60題學(xué)會(huì)動(dòng)態(tài)規(guī)劃系列:動(dòng)態(tài)規(guī)劃算法第一講

    60題學(xué)會(huì)動(dòng)態(tài)規(guī)劃系列:動(dòng)態(tài)規(guī)劃算法第一講

    堅(jiān)持就是勝利 - -? 文章目錄 1.第N個(gè)泰波那切數(shù) 2.三步問題 3.使用最小花費(fèi)爬樓梯 4.解碼方法 力扣鏈接:力扣 泰波那契序列?Tn?定義如下:? T0?= 0, T1?= 1, T2?= 1, 且在 n = 0?的條件下 Tn+3?= Tn?+ Tn+1?+ Tn+2 給你整數(shù)? n ,請(qǐng)返回第 n 個(gè)泰波那契數(shù)?Tn?的值。 ?首先我們分析一下

    2024年02月06日
    瀏覽(20)
  • 專題一:遞推與遞歸

    專題一:遞推與遞歸

    遞歸 ?遞歸實(shí)現(xiàn)指數(shù)型枚舉 從?1~n這?n個(gè)整數(shù)中隨機(jī)選取任意多個(gè),輸出所有可能的選擇方案。 輸入格式 輸入一個(gè)整數(shù)?n。 輸出格式 每行輸出一種方案。 同一行內(nèi)的數(shù)必須升序排列,相鄰兩個(gè)數(shù)用恰好?1?個(gè)空格隔開。 對(duì)于沒有選任何數(shù)的方案,輸出空行。 各行(不同

    2024年02月03日
    瀏覽(19)
  • 【遞推與遞歸】python例題詳解

    文章目錄 1、遞歸實(shí)現(xiàn)指數(shù)型枚舉 2、遞歸實(shí)現(xiàn)排列型枚舉 3、遞歸實(shí)現(xiàn)組合型枚舉 4、簡(jiǎn)單斐波那契 5、帶分?jǐn)?shù) 6、翻硬幣 1、遞歸實(shí)現(xiàn)指數(shù)型枚舉 題目 從?1~n這?n個(gè)整數(shù)中隨機(jī)選取任意多個(gè),輸出所有可能的選擇方案。 輸入格式 輸入一個(gè)整數(shù)?n。 輸出格式 每行輸出一種方

    2024年04月25日
    瀏覽(12)
  • 藍(lán)橋杯備賽 day 1 —— 遞歸 、遞歸、枚舉算法(C/C++,零基礎(chǔ),配圖)

    藍(lán)橋杯備賽 day 1 —— 遞歸 、遞歸、枚舉算法(C/C++,零基礎(chǔ),配圖)

    目錄 ??前言 ?? 枚舉的概念 ??遞歸的概念 ? ??例題: 1.?遞歸實(shí)現(xiàn)指數(shù)型枚舉 2.?遞歸實(shí)現(xiàn)排列型枚舉 3.?遞歸實(shí)現(xiàn)組合型枚舉 ?? 遞推的概念 ? ?例題: 斐波那契數(shù)列 ??習(xí)題 1. 帶分?jǐn)?shù) 2. 反硬幣 3. 費(fèi)解的開關(guān) ?? 總結(jié) ? ? ? ? ???????? 這篇文章主要是準(zhǔn)備藍(lán)橋杯競(jìng)

    2024年02月03日
    瀏覽(29)
  • LeetCode 0746. 使用最小花費(fèi)爬樓梯:動(dòng)態(tài)規(guī)劃(原地)——不用什么從遞歸到遞推

    力扣題目鏈接:https://leetcode.cn/problems/min-cost-climbing-stairs/ 給你一個(gè)整數(shù)數(shù)組 cost ,其中 cost[i] 是從樓梯第 i 個(gè)臺(tái)階向上爬需要支付的費(fèi)用。一旦你支付此費(fèi)用,即可選擇向上爬一個(gè)或者兩個(gè)臺(tái)階。 你可以選擇從下標(biāo)為 0 或下標(biāo)為 1 的臺(tái)階開始爬樓梯。 請(qǐng)你計(jì)算并返回達(dá)到樓

    2024年02月03日
    瀏覽(16)
  • 藍(lán)橋杯 第一場(chǎng)算法雙周賽題解(前五題)

    藍(lán)橋杯 第一場(chǎng)算法雙周賽題解(前五題)

    題目鏈接在此??:第 1 場(chǎng)算法雙周賽 - 藍(lán)橋云課 為什么只有前5道題的題解呢?(懂的都懂~??) 考察:簡(jiǎn)單邏輯判斷 問題描述 小藍(lán)和小橋玩斗地主,小藍(lán)只剩四張牌了,他想知道是否是“三帶一”牌型。 所胃三帶一”牌型,即四張手牌中,有三張牌一樣,另外一張不與其

    2024年02月08日
    瀏覽(26)
  • C++Primer——第一講

    C++Primer——第一講

    重制C++Primer 目錄 一、第一個(gè)程序 二、代碼? 二、題目 我們會(huì)從一個(gè)C++程序開始,這里默認(rèn)您已經(jīng)安裝了Dev-C++或其他的IDE軟件。 下面這串代碼是可以輸出“Hello world”的代碼。 ?如果要運(yùn)行它,就應(yīng)該先將它編譯成程序。先打開IDE,新建一個(gè)文件(Ctrl+N): 接著,您可以復(fù)

    2024年02月08日
    瀏覽(22)
  • 第一講:入門知識(shí)筆記

    python 變量無類型,但值里面有類型。 動(dòng)態(tài)類型語言(pythonjavascript) Subtraction reverse 3-digit number 判斷兩個(gè)浮點(diǎn)數(shù)是否相等不能直接用== 運(yùn)算優(yōu)先級(jí) operation precedence not and or 計(jì)算閏年 交換變量 name variable google.github.io/styleguide/pyguide.html python中的權(quán)限控制access control 默認(rèn)成員變量

    2024年01月25日
    瀏覽(22)
  • 「藍(lán)橋·算法雙周賽」第一場(chǎng)公開賽【待補(bǔ)題填坑】

    「藍(lán)橋·算法雙周賽」第一場(chǎng)公開賽【待補(bǔ)題填坑】

    給定四個(gè)字符,判斷是否其中有三個(gè)相同,另一個(gè)與他們不同 ?二叉樹性質(zhì)問題,不了解二叉樹也完全可以做。 要注意的是每次都從第一行的第一個(gè)點(diǎn)開始走,給一個(gè)字符串按照它走,輸出最后的結(jié)果就行。 往左走坐標(biāo)就變成了2*pos-1,往右就變成了2*pos 畫個(gè)樹理解一下就好

    2024年02月07日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包