Banyan_2015 c

/*
 * @brief bayan_2015 c
 * @file c.c
 * @author xiyan
 * @CreatedTime 2014/11/04
 * @LastChanged 2014/11/06
 * @note
 *      type: dfs, brute, greedy, dp
 *
 *
 */


#include <stdio.h>

#define MAXN 1100

int table[MAXN][MAXN];          /*1. altered 0. not*/
int sum[MAXN][MAXN];            /*used for dp*/
char buf[MAXN];                 /*quick IO*/

int area;                       /*area brush covered*/
int row, col;                   /*brush size*/
int row_pos, col_pos;                    /*brush pos*/  
int m, n;                       /*frame size*/
int start_row, start_col;       /*start pos*/
int max_row, max_col;     
int cnt, tot;


#define CLR(vec) memset(vec, 0, sizeof(vec))
#define min(x,y) ((x) < (y) ? (x) : (y))

#define CHECK_MV(x, y, d, r)    ( (x + d <= m) && (y + r <= n) && \
        (sum[x + d][ y + r] - sum[x + d][y] - sum[x][y + r] + sum[x][y] == (d)*(r)))


int dfs(int row_pos, int col_pos){
    int col_move;
    int row_move;
    int i;

    if(0 == CHECK_MV(row_pos, col_pos, row, col)){
        return -1;    
    }

    cnt = row * col;

    while(1){

        if(tot == cnt){
            return 0;
        }
        
    col_move = 0;
    for(i = 1; CHECK_MV(row_pos, col_pos , row, i +  col); i++){
        col_move++;
    }
#ifdef DEBUG
    printf("--------------------------------------------------\n");
#endif
        row_move = 0;
        for(i = 1;  CHECK_MV(row_pos, col_pos, i + row, col); i++){
             row_move++;           
    }

#ifdef DEBUG
    printf("row_pos:%d, col_pos:%d, col_move:%d, row_move:%d, tot:%d\n", row_pos, col_pos, col_move, row_move, cnt);
#endif

        if( !col_move && !row_move)
            return -1;
        if( col_move && row_move)
            return -1;

        if(col_move){
            col_pos += col_move;
            cnt += row*col_move;
        }else{
            row_pos += row_move;
            cnt += col*row_move;
        }
    }
}


int main()
{
    int start_find = 0;
    int i, j;
    tot = 0;
#ifdef DEBUG
    freopen("./in",  "r", stdin);
    freopen("./out", "w", stdout);
#endif

    scanf("%d%d", &m, &n);
    getchar();

    for(i = 0; i < m; i++){
            gets(buf);
            for(j = 0; j < n; j++){
                    if(buf[j] == 'X'){
                            table[i][j] = 1;
                            if(start_find == 0){
                                    start_find = 1;
                                    start_row = i;
                                    start_col = j;
                            }
                            tot++;
                    }else{
                            table[i][j] = 0;
                    }
            /*dp here*/ 
                    sum[i + 1][j + 1] =  sum[i][j + 1] + sum[i + 1][j] - sum[i][j] + (table[i][j]? 1 : 0); 
            }
    }
#ifdef DEBUG
    for(i = 0; i < m; i++){
        for(j = 0; j < n; j++)
            printf("%c", table[i][j] ? 'X': '.');
        printf("\n");
    }
    for(i = 0; i < m + 1; i++){
        for(j = 0; j < n + 1; j++)
            printf("%d ", sum[i][j]);
        printf("\n");
    }
#endif

    for(max_row = 0 ; (start_row + max_row <= m) && table[start_row + max_row][start_col]; max_row++)
                                ;
    for(max_col = 0 ; (start_col + max_col <= n) && table[start_row][start_col + max_col]; max_col++) 
                                ;

#ifdef  DEBUG
    printf("start_row: %d; start_col:%d, max_row: %d; max_col: %d\n", start_row, start_col, max_row, max_col);
#endif

    area = 0x7fffffff;

    for(col = max_col, row = 1; row <= max_row; row++)
        if( 0 == dfs(start_row, start_col))
                    area = min(area, row*col);

    for(row = max_row, col = 1; col <= max_col; col++)
            if( 0 == dfs(start_row, start_col))
                    area = min(area, row*col);

    if(area == 0x7fffffff)
            printf("-1\n");
    else
            printf("%d\n", area);
    return 0;
}


转载于:https://my.oschina.net/u/572632/blog/343451

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值