又是一道眼高手低的題目,考察的是最基礎的遞迴,然而我又錯了
畫個圖方便理解
很容易想到用遞迴,用遞迴的話,先考慮遞迴的邊界,就是遞迴何時結束
對於乙個正方形陣列,首先將其分為四份,左上角那一塊全部赦免,再依次遞迴其餘三部分,當這個正方形陣列的邊長為2時,
就可以結束遞迴了。
1 #include 2using
namespace
std;
3const
int n = 2048;4
inta[n][n];
5int n; //
次方數6
int p = 1; //
p = 2 ^ n
7void di(int x,int l,int
q) 14
for (int i = l; i <= l + x / 2 - 1; i++) 18}
19 di(x / 2, l + x / 2, q); //
遞迴處理剩餘的三個正方形,注意引數
20 di(x / 2, l + x / 2, q + x / 2); //
遞迴處理剩餘的三個正方形,注意引數
21 di(x / 2, l, q + x / 2); //
遞迴處理剩餘的三個正方形,注意引數22}
23int
main()
28for (int i = 1; i <= p; i++) 32}
33 di(p, 1, 1); //
開始遞迴
34for (int i = 1; i <= p; i++)
38 cout <
40return0;
41 }
P5461 赦免戰俘(遞迴)
這題就是要用遞迴來寫。就是分成四個區域,然後把第一塊全部賦值為0,然後繼續遞迴。結束條件就是正方形的邊為2。include using namespace std int vis 1050 1050 int n void dfs int p,int x,int y for int i x i x p...
LGOJ P5461 赦免戰俘
乙個 2n 2n 2 n times2 n 2n 2 n 的矩陣,每個位置站著乙個作弊者,每次將正方形矩陣分割成4個更小的正方形矩陣,每個矩陣的邊長是原矩陣的一半。其中左上角那乙個矩陣的所有作弊者都將得到赦免,剩下的三個矩陣中,每乙個矩陣繼續分為 4 個更小的矩陣,然後以同樣的方式分割矩陣,以同樣的...
P2016 戰略遊戲
樹形dp f u 0 表示 uf u 0 表示u f u 0 表示u 號節點不放士兵,以x為根的子樹需要的最少士兵數。f u 1 表示 uf u 1 表示u f u 1 表示u 號節點放士兵,以x為根的子樹需要的最少士兵數。由於我們定義的是將其完全覆蓋,則我們不需要考慮父親節點,為什麼?當我們已經回...