acdream 1705(暴力)

题意:有一块n*m大的草坪,’.’表示空地,’x’表示种了棵树,现在要给这块草坪建一个矩形栅栏,栅栏必须建在空地上,问栅栏建好的最大周长是多少,也就是最多占用了多少个空地。 题解:暴力,需要预处理出每个空地右边空地的数量存到r[i][j]和下方空地的数量d[i][j],,然后枚举每个空地把它当做栅栏的左上角顶点,根据r和d两个数组得到上和左两条边可能的长度,然后枚举上和左的长度如果下和右也都满足条件(即不出现’x’),更新最大值。

;const int N = 505;int n, m;char g[N][N], r[N][N], d[N][N];int main() {while (scanf(“%d%d”, &n, &m) == 2) {memset(r, 0, sizeof(r));memset(d, 0, sizeof(d));for (int i = 0; i < n; i++)scanf(“%s”, g[i]);for (int i = 0; i < n; i++)for (int j = 0; j < m; j++) {if (g[i][j] == ‘.’) {for (int k = j + 1; k < m && g[i][k] != ‘x’; k++)r[i][j]++;for (int k = i + 1; k < n && g[k][j] != ‘x’; k++)d[i][j]++;}}int res = 0;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++) {if (g[i][j] == ‘.’) {for (int r1 = r[i][j]; r1 >= 1; r1–)for (int d1 = d[i][j]; d1 >= 1; d1–)if (r[i + d1][j] >= r1 && d[i][j + r1] >= d1)res = max(res, 2 * (r1 + d1));}}if (res >= 4)printf(“%d\n”, res);elseprintf(“impossible\n”);}return 0;}

背着背包的路上,看过许多人,听过许多故事,

acdream 1705(暴力)

相关文章:

你感兴趣的文章:

标签云: