@@ -111,6 +111,46 @@ class Solution:
111
111
return ans
112
112
```
113
113
114
+ ``` python
115
+ class Solution :
116
+ def tilingRectangle (self , n : int , m : int ) -> int :
117
+ def dfs (i : int , j : int , t : int ):
118
+ nonlocal ans
119
+ if j == m:
120
+ i += 1
121
+ j = 0
122
+ if i == n:
123
+ ans = t
124
+ return
125
+ if filled[i] >> j & 1 :
126
+ dfs(i, j + 1 , t)
127
+ elif t + 1 < ans:
128
+ r = c = 0
129
+ for k in range (i, n):
130
+ if filled[k] >> j & 1 :
131
+ break
132
+ r += 1
133
+ for k in range (j, m):
134
+ if filled[i] >> k & 1 :
135
+ break
136
+ c += 1
137
+ mx = min (r, c)
138
+ for x in range (i, i + mx):
139
+ for y in range (j, j + mx):
140
+ filled[x] |= 1 << y
141
+ for w in range (mx, 0 , - 1 ):
142
+ dfs(i, j + w, t + 1 )
143
+ for k in range (w):
144
+ filled[i + w - 1 ] ^= 1 << (j + k)
145
+ if k < w - 1 :
146
+ filled[i + k] ^= 1 << (j + w - 1 )
147
+
148
+ ans = n * m
149
+ filled = [0 ] * n
150
+ dfs(0 , 0 , 0 )
151
+ return ans
152
+ ```
153
+
114
154
### ** Java**
115
155
116
156
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -174,6 +214,67 @@ class Solution {
174
214
}
175
215
```
176
216
217
+ ``` java
218
+ class Solution {
219
+ private int n;
220
+ private int m;
221
+ private int [] filled;
222
+ private int ans;
223
+
224
+ public int tilingRectangle (int n , int m ) {
225
+ this . n = n;
226
+ this . m = m;
227
+ ans = n * m;
228
+ filled = new int [n];
229
+ dfs(0 , 0 , 0 );
230
+ return ans;
231
+ }
232
+
233
+ private void dfs (int i , int j , int t ) {
234
+ if (j == m) {
235
+ ++ i;
236
+ j = 0 ;
237
+ }
238
+ if (i == n) {
239
+ ans = t;
240
+ return ;
241
+ }
242
+ if ((filled[i] >> j & 1 ) == 1 ) {
243
+ dfs(i, j + 1 , t);
244
+ } else if (t + 1 < ans) {
245
+ int r = 0 , c = 0 ;
246
+ for (int k = i; k < n; ++ k) {
247
+ if ((filled[k] >> j & 1 ) == 1 ) {
248
+ break ;
249
+ }
250
+ ++ r;
251
+ }
252
+ for (int k = j; k < m; ++ k) {
253
+ if ((filled[i] >> k & 1 ) == 1 ) {
254
+ break ;
255
+ }
256
+ ++ c;
257
+ }
258
+ int mx = Math . min(r, c);
259
+ for (int x = i; x < i + mx; ++ x) {
260
+ for (int y = j; y < j + mx; ++ y) {
261
+ filled[x] |= 1 << y;
262
+ }
263
+ }
264
+ for (int w = mx; w > 0 ; -- w) {
265
+ dfs(i, j + w, t + 1 );
266
+ for (int k = 0 ; k < w; ++ k) {
267
+ filled[i + w - 1 ] ^ = 1 << (j + k);
268
+ if (k < w - 1 ) {
269
+ filled[i + k] ^ = 1 << (j + w - 1 );
270
+ }
271
+ }
272
+ }
273
+ }
274
+ }
275
+ }
276
+ ```
277
+
177
278
### ** C++**
178
279
179
280
``` cpp
@@ -236,6 +337,68 @@ private:
236
337
};
237
338
```
238
339
340
+ ``` cpp
341
+ class Solution {
342
+ public:
343
+ int tilingRectangle(int n, int m) {
344
+ memset(filled, 0, sizeof(filled));
345
+ this->n = n;
346
+ this->m = m;
347
+ ans = n * m;
348
+ dfs(0, 0, 0);
349
+ return ans;
350
+ }
351
+
352
+ private:
353
+ int filled[ 13] ;
354
+ int n, m;
355
+ int ans;
356
+
357
+ void dfs(int i, int j, int t) {
358
+ if (j == m) {
359
+ ++i;
360
+ j = 0;
361
+ }
362
+ if (i == n) {
363
+ ans = t;
364
+ return;
365
+ }
366
+ if (filled[i] >> j & 1) {
367
+ dfs (i, j + 1, t);
368
+ } else if (t + 1 < ans) {
369
+ int r = 0, c = 0;
370
+ for (int k = i; k < n; ++k) {
371
+ if (filled[ k] >> j & 1) {
372
+ break;
373
+ }
374
+ ++r;
375
+ }
376
+ for (int k = j; k < m; ++k) {
377
+ if (filled[ i] >> k & 1) {
378
+ break;
379
+ }
380
+ ++c;
381
+ }
382
+ int mx = min(r, c);
383
+ for (int x = i; x < i + mx; ++x) {
384
+ for (int y = j; y < j + mx; ++y) {
385
+ filled[ x] |= 1 << y;
386
+ }
387
+ }
388
+ for (int w = mx; w; --w) {
389
+ dfs(i, j + w, t + 1);
390
+ for (int k = 0; k < w; ++k) {
391
+ filled[ i + w - 1] ^= 1 << (j + k);
392
+ if (k < w - 1) {
393
+ filled[ i + k] ^= 1 << (j + w - 1);
394
+ }
395
+ }
396
+ }
397
+ }
398
+ }
399
+ };
400
+ ```
401
+
239
402
### ** Go**
240
403
241
404
``` go
@@ -295,6 +458,65 @@ func min(a, b int) int {
295
458
}
296
459
```
297
460
461
+ ``` go
462
+ func tilingRectangle (n int , m int ) int {
463
+ ans := n * m
464
+ filled := make ([]int , n)
465
+ var dfs func (i, j, t int )
466
+ dfs = func (i, j, t int ) {
467
+ if j == m {
468
+ i++
469
+ j = 0
470
+ }
471
+ if i == n {
472
+ ans = t
473
+ return
474
+ }
475
+ if filled[i]>>j&1 == 1 {
476
+ dfs (i, j+1 , t)
477
+ } else if t+1 < ans {
478
+ var r , c int
479
+ for k := i; k < n; k++ {
480
+ if filled[k]>>j&1 == 1 {
481
+ break
482
+ }
483
+ r++
484
+ }
485
+ for k := j; k < m; k++ {
486
+ if filled[i]>>k&1 == 1 {
487
+ break
488
+ }
489
+ c++
490
+ }
491
+ mx := min (r, c)
492
+ for x := i; x < i+mx; x++ {
493
+ for y := j; y < j+mx; y++ {
494
+ filled[x] |= 1 << y
495
+ }
496
+ }
497
+ for w := mx; w > 0 ; w-- {
498
+ dfs (i, j+w, t+1 )
499
+ for k := 0 ; k < w; k++ {
500
+ filled[i+w-1 ] ^= 1 << (j + k)
501
+ if k < w-1 {
502
+ filled[i+k] ^= 1 << (j + w - 1 )
503
+ }
504
+ }
505
+ }
506
+ }
507
+ }
508
+ dfs (0 , 0 , 0 )
509
+ return ans
510
+ }
511
+
512
+ func min (a , b int ) int {
513
+ if a < b {
514
+ return a
515
+ }
516
+ return b
517
+ }
518
+ ```
519
+
298
520
### ** TypeScript**
299
521
300
522
``` ts
@@ -346,6 +568,57 @@ function tilingRectangle(n: number, m: number): number {
346
568
}
347
569
```
348
570
571
+ ``` ts
572
+ function tilingRectangle(n : number , m : number ): number {
573
+ let ans = n * m ;
574
+ const filled: number [] = new Array (n ).fill (0 );
575
+ const dfs = (i : number , j : number , t : number ) => {
576
+ if (j === m ) {
577
+ ++ i ;
578
+ j = 0 ;
579
+ }
580
+ if (i === n ) {
581
+ ans = t ;
582
+ return ;
583
+ }
584
+ if ((filled [i ] >> j ) & 1 ) {
585
+ dfs (i , j + 1 , t );
586
+ } else if (t + 1 < ans ) {
587
+ let [r, c] = [0 , 0 ];
588
+ for (let k = i ; k < n ; ++ k ) {
589
+ if ((filled [k ] >> j ) & 1 ) {
590
+ break ;
591
+ }
592
+ ++ r ;
593
+ }
594
+ for (let k = j ; k < m ; ++ k ) {
595
+ if ((filled [i ] >> k ) & 1 ) {
596
+ break ;
597
+ }
598
+ ++ c ;
599
+ }
600
+ const mx = Math .min (r , c );
601
+ for (let x = i ; x < i + mx ; ++ x ) {
602
+ for (let y = j ; y < j + mx ; ++ y ) {
603
+ filled [x ] |= 1 << y ;
604
+ }
605
+ }
606
+ for (let w = mx ; w > 0 ; -- w ) {
607
+ dfs (i , j + w , t + 1 );
608
+ for (let k = 0 ; k < w ; ++ k ) {
609
+ filled [i + w - 1 ] ^= 1 << (j + k );
610
+ if (k < w - 1 ) {
611
+ filled [i + k ] ^= 1 << (j + w - 1 );
612
+ }
613
+ }
614
+ }
615
+ }
616
+ };
617
+ dfs (0 , 0 , 0 );
618
+ return ans ;
619
+ }
620
+ ```
621
+
349
622
### ** ...**
350
623
351
624
```
0 commit comments