Titelportal: https://www.luogu.com.cn/problem/P5461
Die Analyse des Problems hat offensichtlich die Natur der Rekursion, der Code ist auch sehr einfach, einfache Simulation + Rekursion.
In den Codekommentaren finden Sie spezifische Erklärungen.
Code:
1 #include <iostream> 2 using namespace std; 3 int n; 4 int num [ 15 ] = { 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 , 512 , 1024 }; // Dutzend eins Blatt 2 Leistungstabelle 5 int sum [ 2000 ] [ 2000 ]; 6 void work ( int x1, int y1, intx2, int y2, int flag, int len) { // x1, y1 sind die Koordinaten der oberen linken Ecke, x2, y2 sind die Koordinaten der unteren rechten Ecke, Flag bedeutet (0) nicht (1) alle Nullen in diesem Bereich, len befindet sich in diesem Bereich Seitenlänge. (Tatsächlich ist x2y2 mit len nicht erforderlich.) 7 if (flag == 0 ) return ; // Wenn alles Null ist, tun Sie es nicht, da der Anfangswert der Summe 0 8 ist, wenn (len == 1 ) { 9 sum [x1] [y1] = 1 ; 10 return ; 11 } // Wenn die Länge dieses Intervalls 1 und nicht alle Nullen beträgt, weisen Sie 1 12 Arbeit zu (x1, y1, x2-len / 2 , y2-len / 2) , 0 , len / 2 );// Das Intervall in der oberen linken Ecke beträgt 13 Arbeit (x1, y1 + len / 2 , x2-len / 2 , y2, 1 , len / 2 ); // Die folgenden Intervalle müssen erneut wiederholt werden 14 Arbeit (x1) + len / 2 , y1, x2, y2-len / 2 , 1 , len / 2 ); 15 Arbeit (x1 + len / 2 , y1 + len / 2 , x2, y2, 1 , len / 2 ); 16 } 17 int main () { 18 cin >> n; n = num [n]; // 2 hoch 19 19 Arbeit ( 1 , 1n, n, 1 , n); 20 für ( int i = 1 ; i <= n; ++ i) { 21 für ( int j = 1 ; j <= n; ++ j) cout << sum [i] [j] << " " ; 22 cout << endl; 23 } // 输出 24 return 0 ; 25 }