cf475C

来源:互联网 发布:表情包for mac 编辑:程序博客网 时间:2024/06/15 23:22

http://codeforces.com/contest/475/problem/C

在一块n*m的区域中有一块a*b的刷子,这块刷子只能向下or向右,扫过的区域为x

给出一块区域,问这个区域是否可以由某块刷子刷成,如果可以输出刷子最小面积,不可以则输出-1


const  int  maxn = 1008  ;int   n ,  m ;char  g[maxn][maxn]  ;int   dp[maxn][maxn] ;int   sum(int sx , int sy , int ex , int ey){      return dp[ex][ey] - dp[sx-1][ey] - dp[ex][sy-1] + dp[sx-1][sy-1] ;}int   gao(int x , int y , int w , int h){      while(1){           if(x + w -1 > n || y + h -1 > m)  return 0 ;           if(sum(x , y , x+w-1 , y+h-1) != w * h) return 0 ;           if(sum(x+w , y, n , m) == 0 && sum(x , y+h , n , m) == 0) return 1 ;           if(sum(x+w , y , n , y) > 0 && sum(x , y+h , x , m) > 0) return 0 ;           if(sum(x+w , y , n , y) == 0) y++ ;           else   x++ ;      }      return 1 ;}int   main(){      int i , j  , t , sx , sy ;      while(cin>>n>>m){           for(i = 1 ; i <= n ; i++) scanf("%s" , g[i] + 1) ;           memset(dp , 0 , sizeof(dp)) ;           sx = n + 1 , sy = m + 1 ;           for(i = 1 ; i <= n ; i++){               for(j = 1 ; j <= m ; j++){                   dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + (g[i][j] == 'X') ;                   if(g[i][j] == 'X'){                       sx = std::min(sx , i) ;                       sy = std::min(sy , j) ;                   }               }           }           t = 1<<30 ;           for(i = 1 ; i <= n ; i++){              for(j = 1 ; j <= m ; j++){                   if(i * j >= t) continue ;                   if(gao(sx , sy , i , j)) t = i * j ;              }           }           if(t == (1<<30)) puts("-1") ;           else             printf("%d\n" , t) ;      }      return 0  ;}


0 0
原创粉丝点击