直接暴力枚举锤子的长宽
然后判断
别忘了加点剪枝,不加可能会痿
#include<iostream> #include<cstdio> #include<cstring> #define inf 0x7fffffff using namespace std; int n,m,sum,mp[101][101],t[101][101],ans=inf; void work(int x,int y){ for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ t[i][j]=mp[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(t[i][j]){ if(i+x<=n+1&&j+y<=m+1){ int tmp=t[i][j]; for(int k=0;k<x;k++){ for(int l=0;l<y;l++){ t[i+k][j+l]-=tmp; if(t[i+k][j+l]<0){ return; } } } }else{ return; } } } } ans=sum/(x*y); } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>mp[i][j]; sum+=mp[i][j]; } } for(int i=n;i>0;i--){ for(int j=m;j>0;j--){ if(sum%(i*j)==0&&sum/(i*j)<ans){ work(i,j); } } } cout<<ans; return 0; }