藍橋杯 遞迴 2 24

2021-10-20 00:07:04 字數 3571 閱讀 4170

回形取數(藍橋杯 基礎練習)

問題描述

回形取數就是沿矩陣的邊取數,若當前方向上無數可取或已經取過,則左轉90度。一開始位於矩陣左上角,方向向下。

輸入格式

輸入第一行是兩個不超過200的正整數m, n,表示矩陣的行和列。接下來m行每行n個整數,表示這個矩陣。

輸出格式

輸出只有一行,共mn個數,為輸入矩陣回形取數得到的結果。數之間用乙個空格分隔,行末不要有多餘的空格。

樣例輸入

3 31 2 3

4 5 6

7 8 9

樣例輸出

1 4 7 8 9 6 3 2 5

樣例輸入

3 21 2

3 45 6

樣例輸出

1 3 5 6 4 2

int dx[ ] = , dy[ ] = ;下 右 上 左

int dx[ ] = , dy[ ] = ;上 右 下 左

#include

#include

using

namespace std;

const

int n =

210;

int m, n;

int g[n]

[n];

bool st[n]

[n];

int dx[4]

=, dy[4]

=;//下 右 上 左

//int dx = , dy = ;

intmain()

x = a, y = b;

}return0;

}

藍橋杯演算法教學與培訓 1.遞迴與迴圈

構造相似性(不能相似的原因可能是缺少引數)

被調函式恰為主調函式

每次呼叫的層次不同

每次返回的形參並非同一變數

注意返回的次序

遞迴實現組合型列舉(acwing)

從 1~n 這 n 個整數中隨機選出 m 個,輸出所有可能的選擇方案。

輸入格式

兩個整數 n,m ,在同一行用空格隔開。

輸出格式

按照從小到大的順序輸出所有方案,每行1個。

首先,同一行內的數公升序排列,相鄰兩個數用乙個空格隔開。

其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面(例如1 3 5 7排在1 3 6 8前面)。

資料範圍

n>0 ,

0≤m≤n ,

n+(n−m)≤25

輸入樣例:

5 3輸出樣例:

1 2 3

1 2 4

1 2 5

1 3 4

1 3 5

1 4 5

2 3 4

2 3 5

2 4 5

3 4 5

1.遞迴方法

#include

#include

using

namespace std;

int n, m;

void

dfs(

int pi,

int s,

int state)

//選dfs

(pi +

1, s +

1, state |

1<< pi)

;//把state中的第pi + 1位置成1

//不選

dfs(pi +

1, s, state);}

intmain()

解釋state | 1 << pi

<< 的優先順序大於 |

例:假設已選的數是 2,3,那麼這次傳進來的 state 就是 0000 1100

現在要選5

pi = 5

1 << pi (1左移 n 位):

0000 0001 → 0010 0000

與 state 或運算 state | (1 << pi) :

0010 0000

0000 1100

或運算得

0010 1100

那麼下一輪遞迴要傳入的 state 就是 0010 1100

這樣就表示已選 2 3 5

(pi 要是從 0 開始看,就是 0001 0110 ,選了哪個數,state 的哪一位就是 1,對於 state 來說貌似更直觀一些,)

//pi 從 0 開始看

#include

#include

using

namespace std;

int n, m;

void

dfs(

int pi,

int s,

int state)

//選dfs

(pi +

1, s +

1, state |

1<< pi)

;//把state中的第pi + 1位置成1

//不選

dfs(pi +

1, s, state);}

intmain()

2. 非遞迴方法

用棧來代替遞迴函式 實際上計算機中的遞迴函式也是通過棧實現的

pi 的每次遍歷都分為不選和選兩種情況

由於棧是先進先出的,且先看選的情況後看不選的情況,所以先放不選後放選

每次遍歷到某個結點 pi 時

左分枝是選下乙個點 p1 + 1,右分枝是空的表示不選p1 + 1

直到某點滿足某個判斷條件後結束本次迴圈

回溯到上乙個點 pi』 的右分枝,又分為選 pi』 + 1 和不選 pi』 + 1 兩種情況

將遞迴函式轉化為迴圈具體步驟:

當然也可分為三種狀態 加上**中注釋掉的部分

#include

#include

#include

using

namespace std;

struct state

;int n, m;

intmain()

);while

(stk.

size()

)

t.pos =1;

stk.

push

(t);

//不選

stk.

push()

;}else

if(t.pos ==1)

);}//else continue;

}//while

return0;

}

藍橋杯 練習(2 24)

給定n個十六進製制正整數,輸出它們對應的八進位制數。輸入的第一行為乙個正整數n 1 n 10 接下來n行,每行乙個由09 大寫字母af組成的字串,表示要轉換的十六進製制正整數,每個十六進製制數長度不超過100000。輸出n行,每行為輸入對應的八進位制正整數。注意 輸入的十六進製制數不會有前導0,比如...

藍橋杯練習 2 24

藍橋試題 基礎練習 十六進製制轉八進位制 問題描述 給定n個十六進製制正整數,輸出它們對應的八進位制數。輸入格式 輸入的第一行為乙個正整數n 1 n 10 接下來n行,每行乙個由09 大寫字母af組成的字串,表示要轉換的十六進製制正整數,每個十六進製制數長度不超過100000。輸出格式 輸出n行,每...

藍橋杯 遞迴問題

深入遞推,逐級回退 遞迴問題 深搜dfs 在有條件的情況下試探各種情況 找出口 遞迴的終止條件 遞迴函式引數邊界值的界定 思想 1.src上的n 1個盤子移到medium 2.src剩下的乙個最大的盤子移到dest 3.medium上的n 1個盤子移到dest 把src最上面的乙個盤子移到dest ...