#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int x[100], y[100], best, cnt[10];
int step[8][2] = {-1, -1, -1, 0, -1, 1, 0, -1, 0, 1, 1, -1, 1, 0, 1, 1};
int getsum(int maxH, int maxW, int num[][9]) {
int s = 0; memset(cnt, 0, sizeof(cnt));
for (int i = 1; i <= maxH; ++i)
for (int j = 1; j <= maxW; ++j)
if (num[i][j]) cnt[num[i][j]]++;
for (int i = 1; i < 10; ++i)
if (cnt[i]) s += cnt[i] * cnt[i];
return s;
}
void dfs(int num[][9], int maxH, int maxW, int sum) {
best = max(best, sum);
int temp[9][9], vst[9][9], nx, ny;
if (!maxH || !maxW) return ;
if (getsum(maxH, maxW, num) + sum <= best) return ;
memset(vst, 0, sizeof(vst));
memset(temp, 0, sizeof(temp));
int nowclr = 0, l, r;
for (int i = 1; i <= maxH; ++i)
for (int j = 1; j <= maxW; ++j)
if ((num[i][j] != 0) && (vst[i][j] == 0)) {
++nowclr; l = 1; r = 1;
x[1] = i; y[1] = j; vst[i][j] = nowclr;
while (l <= r) {
nx = x[l]; ny = y[l++];
for (int k = 0; k < 8; ++k) {
int dx = nx + step[k][0], dy = ny + step[k][1];
if (num[dx][dy] == num[i][j] && !vst[dx][dy]) {
vst[dx][dy] = nowclr;
x[++r] = dx; y[r] = dy;
}
}
}
if (r < 3) continue;
for (int x = 1; x <= maxH; ++x)
for (int y = 1; y <= maxW; ++y)
if (vst[x][y] == nowclr) temp[x][y] = 0;
else temp[x][y] = num[x][y];
int nmaxH = 0, nmaxW = 0;
for (int x = 1; x <= maxW; ++x) {
int ptr = 0;
for (int y = 1; y <= maxH; ++y)
if (temp[y][x]) {
temp[++ptr][x] = temp[y][x];
}
for (int y = ptr+1; y <= maxH; ++y) temp[y][x] = 0;
nmaxH = max(nmaxH, ptr);
}
int ptr = 0;
for (int x = 1; x <= maxW; ++x)
if (temp[1][x]) {
++ptr;
for (int y = 1; y <= maxH; ++y)
temp[y][ptr] = temp[y][x];
}
for (int y = 1; y <= maxH; ++y)
temp[y][ptr+1] = 0;
nmaxW = ptr;
dfs(temp, nmaxH, nmaxW, sum + r * r);
}
}
int main() {
int n, m, k, num[9][9];
while (scanf("%d%d%d", &n, &m, &k) == 3) {
memset(num, 0, sizeof(num)); best = 0;
for (int i = n; i >= 1; --i)
for (int j = 1; j <= m; ++j) scanf("%d", &num[i][j]);
dfs(num, n, m, 0);
printf("%d\n", best);
}
return 0;
}
hdu 4090 GemAnd Prince (dfs)
最新推荐文章于 2019-05-02 07:59:40 发布