FOJ 1082 最大黑区域

这题做的都要哭出来了。。。。。

早上跑跑卡丁车的题目做了几遍都没过。。。。

没有比那个题目再简单的了。

回去重新写遍代码就AC....

后来看论坛上面大牛指点,原来是数组开的不够大。。。

郁闷,竟然没有Runtime ERROR....

 

这题原来用一种很挫的方法做。。。

后来发现考虑不够全面。。。。

想到连续的1区域其实可以看做联通图。

然后用图的深度优先遍历就可以解决问题。。。

 

但是之前没有写过深度优先遍历的题目。。。

所以对那个递归很不熟悉。。。

还把rect[x+1][y]<1写成了rect[x+1][y]<0.。。。

多练习了。。。

 

不废话,代码如下,很自认为简洁的代码。

 

#include <stdio.h> #include <string.h> int rect[110][110]; void findblack(int x,int y,int &count) { int flag = 0; if (rect[x][y+1]<1&& rect[x][y-1]<1&& rect[x+1][y]<1&& rect[x-1][y]<1) { rect[x][y] = -1; count++; } else { if (rect[x][y+1]==1) { if (flag == 0) { rect[x][y] = -1; count++; flag = 1; } findblack(x,y+1,count); } if (rect[x][y-1]==1) { if (flag == 0) { rect[x][y] = -1; count++; flag = 1; } findblack(x,y-1,count); } if (rect[x+1][y]==1) { if (flag == 0) { rect[x][y] = -1; count++; flag = 1; } findblack(x+1,y,count); } if (rect[x-1][y]==1) { if (flag == 0) { rect[x][y] = -1; count++; flag = 1; } findblack(x-1,y,count); } } } int main() { int m,n; int i,j; int count; int max; while (scanf("%d%d", &m,&n)!=EOF) { if (m==0) break; memset(rect, 0, sizeof(rect)); for (i=1;i<=m;i++) for (j=1;j<=n;j++) scanf("%d", &rect[i][j]); max = 0; for (i=1;i<=m;i++) { for (j=1;j<=n;j++) { count = 0; if (rect[i][j]<1) continue; else findblack(i,j,count); if (max<count) max = count; } } printf("%d/n", max); } return 0; }

你可能感兴趣的:(FOJ 1082 最大黑区域)