北航 2012年考研复试题2
/*理解题目本身意思,可以发现对于矩阵中的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 ", ans); return 0; }