题目

解法
Java
import java.util.Scanner;
public class Main{
private static int max;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
if (n == m){
System.out.print("1");
return;
}
int[][] rectangle = new int[n][m];
max = n*m;
int count = 0;
backTrack(rectangle,0,0,0,n,m);
System.out.println(max);
}
public static void backTrack(int[][] rectangle,int count,int row,int col,int n,int m){
if (count > max) return;
Find:
for (row =0; row < n ; row++) {
for (col =0; col < m ; col++) {
if (rectangle[row][col] == 0){
break Find;
}
}
}
if (row == n && col == m){
max=max > count? count:max;
return;
}
int edge = Math.min(n-row,m-col);
int flag=0;
for (int i = edge; i >0; i--) {
for (int j = row; j <row +i ; j++) {
for (int k = col; k < col +i ; k++) {
if (rectangle[j][k] == 1)flag =1;
}
}
if (flag == 1){
continue ;
}
for (int j = row; j <row +i ; j++) {
for (int k = col; k < col +i ; k++) {
rectangle[j][k] = 1;
}
}
backTrack(rectangle,count+1,row,col,n,m);
for (int j = row; j <row +i ; j++) {
for (int k = col; k <col +i ; k++) {
rectangle[j][k] =0;
}
}
}
}
}
C++
#include<iostream>
using namespace std;
int map[20][20];
int ans=15*15;
int dfs(int n,int m,int num){
if(num>=ans) return 0;
if(n==m){
ans=1;
return 0;
}
int x,y,empty=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(map[i][j]==0){
x=i;
y=j;
empty=1;
break;
}
}
if(empty) break;
}
if(!empty){
ans=min(ans,num);
return 0;
}
for(int add=min(n-x,m-y);add>=1;add--){
bool unlable=true;
for(int i=x;i<x+add;i++){
for(int j=y;j<y+add;j++){
if(map[i][j]==1) {
unlable=false;
break;
}
}
if(!unlable) break;
}
if(!unlable) continue;
for(int i=x;i<x+add;i++){
for(int j=y;j<y+add;j++){
map[i][j]=1;
}
}
dfs(n,m,num+1);
for(int i=x;i<x+add;i++){
for(int j=y;j<y+add;j++){
map[i][j]=0;
}
}
}
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
map[i][j]=0;
}
dfs(n,m,0);
cout<<ans;
return 0;
}