回形取數(藍橋杯 基礎練習)
問題描述
回形取數就是沿矩陣的邊取數,若當前方向上無數可取或已經取過,則左轉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 ...