ZOJ-2067

来源:互联网 发布:淘宝详情页下载工具 编辑:程序博客网 时间:2024/05/29 18:49

数矩形,开始被sample迷惑了。。他给的情况比较简单,没有2*2的矩形,我就枚举了最小边长为1的矩形,直接WA了。。后来看了看大神的题解加上自己的一点点思考再写就AC了。。思路就是保存每个格子同行往右的最大连续白格子数,然后对每个格子再按行枚举矩形,宽度为遍历过程中的最小宽度。。仔细想想应该就明白,讲不大清,看代码吧。。

#include<stdio.h>#include<string.h>static int min(int a, int b){return a < b ? a : b;}int main(){char s[100][100];int a[100][100];int n;while (scanf("%d", &n) != EOF){getchar();int i, j, k;for (i = 0; i < n; i++){for (j = 0; j < n; j++)s[i][j] = getchar();getchar();}memset(a, 0, sizeof(a));for (i = 0; i < n; i++)for (j = 0; j < n; j++)if (s[i][j] == '.'){if (j && a[i][j - 1])a[i][j] = a[i][j - 1] - 1;elsefor (k = j; k < n && s[i][k] == '.'; k++)a[i][j]++;}int res = 0;for (i = 0; i < n; i++)for (j = 0; j < n; j++)if (a[i][j]){res += a[i][j];int minl = a[i][j];for (k = i + 1; k < n && a[k][j]; k++){minl = min(minl, a[k][j]);res += minl;}}printf("%d\n", res);}return 0;}


0 0
原创粉丝点击