标签:
Description
Input
Output
Sample Input
Sample Output
#include<stdio.h> #include<string.h> int map[400][400]; char str[400][400]; int tmin,k; int calculate(int x1,int y1,int x2,int y2){ int point=map[x1][y1]-map[x2-1][y1]-map[x1][y2-1]+map[x2-1][y2-1];//判断这一范围内的顶点数 int area=(x1-x2+1)*(y1-y2+1);//判断这一范围内的面积 if(point>=k&&area<tmin)//如果顶点数足够并且面积可以缩小,则更新最小值 tmin=area; return point; } int main(){ int x,y; while(scanf("%d%d%d",&x,&y,&k)!=EOF){ if(x==0&&y==0&&k==0) break; memset(str,0,sizeof(str)); memset(map,0,sizeof(map)); getchar(); for(int i=1;i<=x;i++){ scanf("%s",str[i]+1); getchar(); int sum=0; for(int j=1;j<=y;j++){ if(str[i][j]==‘.‘) sum++; map[i][j]=map[i-1][j]+sum;//构建map数组,类似于动态规划的思想 } } tmin=1000000; for(int x1=x;x1>=1;x1--){//从下到上 if(map[x1][y]<k) break; for(int x2=1;x2<=x1;x2++){//从上到下 if(map[x1][y]-map[x2-1][y]<k) break; int y1=1,y2=1; while(y1<=y&&y2<=y){//两个顶点从左到右 if(calculate(x1,y1,x2,y2)>=k) y2++; else{ if(y1==y) break; y1++; } } } } printf("%d\n",tmin); } return 0; }
标签:
原文地址:http://www.cnblogs.com/13224ACMer/p/4679204.html