枚举角度DFS。。。。
1 5 4 0 1 0 0 1 0 1 0 1 0 2 1 1 0 0 0 3 1 0 0 1 1 1 0 1 0 1 0 1 0
4
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> using namespace std; map<double,bool> DB; int n,m,ans; int mp[60][60]; inline bool is_in(int x,int y) { if(x>=0&&x<n&&y>=0&y<m) return true; return false; } void dfs(int deep,int remain) { if(deep>=ans) return ; if(remain==0) { ans=min(ans,deep); return ; } bool flag=false; for(int i=0;i<n&&!flag;i++) { for(int j=0;j<m&&!flag;j++) { if(mp[i][j]) { flag=true; if(i==0) { int jian=0; for(int p=0;p<n;p++) { if(mp[p][j]) jian++; else break; } if(jian==n) { for(int p=0;p<n;p++) mp[p][j]--; dfs(deep+1,remain-n); for(int p=0;p<n;p++) mp[p][j]++; } } if(j==0) { int jian=0; for(int q=0;q<m;q++) { if(mp[i][q]) jian++; else break; } if(jian==m) { for(int q=0;q<m;q++) mp[i][q]--; dfs(deep+1,remain-m); for(int q=0;q<m;q++) mp[i][q]++; } } DB.clear(); for(int p=i+1;p<n;p++) { for(int q=0;q<m;q++) { if(mp[p][q]&&q!=j) { int x=p-i,y=q-j; double slope=y*1./x; if(DB[slope]==true) continue; DB[slope]=true; int cnt=0; while(is_in(i+cnt*x,j+cnt*y)&&mp[i+cnt*x][j+cnt*y]) cnt++; if(is_in(i-x,j-y)) continue; if(is_in(i+cnt*x,j+cnt*y)) continue; if(cnt<3) continue; for(int c=0;c<cnt;c++) mp[i+c*x][j+c*y]--; dfs(deep+1,remain-cnt); for(int c=0;c<cnt;c++) mp[i+c*x][j+c*y]++; } } } } } } } int main() { int T_T; scanf("%d",&T_T); while(T_T--) { scanf("%d%d",&n,&m); n++; m++; int sum=0; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf("%d",&mp[i][j]); sum+=mp[i][j]; } } ans=min(14,sum/3); dfs(0,sum); printf("%d\n",ans); } return 0; }
原文:http://blog.csdn.net/ck_boss/article/details/39530207