Rita li

You give me a future, I love you the whole once

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

/*理解题目本身意思,可以发现对于矩阵中的0是否属于内陆,取决于该0所处的行和列上,如果0满足,
如下条件则O为内陆,否则不是。
0所在的行,0的左边和右边必须有1
0所在的列,0的上面和下面必须有1
所以,解题思路就是,遍历所有的行和列,记录改行或列,最左面和最右面(或者最上面和最下面)1的坐标,
然后当遇到0,判断是否处于记录的值的中间,是,则是内陆,面积加1,否则不加。*/

#include <stdio.h>
int L[110][110];
int R[110][110];
int U[110][110];
int D[110][110];
int mat[110][110];

int main() {
    int n, i, j, ans = 0;
    int flag = 0;
//    freopen("A.txt", "r", stdin);
    scanf("%d", &n);
    for(i = 0; i < n; i++) {
        for(j = 0; j < n; j++) {
            scanf("%d", &mat[i][j]);
        }
    }
    //L
    for(i = 0; i < n; i++) {
        flag = 0;
        for(j = 0; j < n; j++) {
            if(mat[i][j] == 1) flag = 1;
            if(flag) L[i][j] = 1;
            else L[i][j] = 0;
        }
    }
    //R
    for(i = 0; i < n; i++) {
        flag = 0;
        for(j = n-1; j >= 0; j--) {
            if(mat[i][j] == 1) flag = 1;
            if(flag) R[i][j] = 1;
            else R[i][j] = 0;
        }
    }
    //U
    for(j = 0; j < n; j++) {
        flag = 0;
        for(i = 0; i < n; i++) {
            if(mat[i][j] == 1) flag = 1;
            if(flag) U[i][j] = 1;
            else U[i][j] = 0;
        }
    }
    //D
    for(j = 0; j < n; j++) {
        flag = 0;
        for(i = n-1; i >= 0; i--) {
            if(mat[i][j] == 1) flag = 1;
            if(flag) D[i][j] = 1;
            else D[i][j] = 0;
        }
    }
    for(i = 0; i < n; i++) {
        for(j = 0; j < n; j++) {
         printf("%d ",L[i][j]); 
        
        }
    }
    for(i = 0; i < n; i++) {
        for(j = 0; j < n; j++) {
            if(L[i][j] && R[i][j] && U[i][j] && D[i][j] && mat[i][j] == 0) ans++;
        }
    }
    printf("%d\n", ans);
    return 0;
}

 

posted on 2014-07-05 21:14  Rita li  阅读(263)  评论(0编辑  收藏  举报