문제

링크

풀이

#include <stdio.h>
 
int simulation(int map[8][8], int n, int m) {
  int changed = 0;
  for (int i=0; i<n; i++) {
    for (int j=0; j<m; j++) {
      if (map[i][j] != 2) continue;
      if (i > 0 && map[i-1][j] == 0) {
        map[i-1][j] = 2;
        changed = 1;
      }
      if (i < n-1 && map[i+1][j] == 0) {
        map[i+1][j] = 2;
        changed = 1;
      }
      if (j > 0 && map[i][j-1] == 0) {
        map[i][j-1] = 2;
        changed = 1;
      }
      if (j < m-1 && map[i][j+1] == 0) {
        map[i][j+1] = 2;
        changed = 1;
      }
    }
  }
  return changed;
}
 
int calc(int map[8][8], int n, int m) {
  int count = 0, tmp[8][8];
 
  for (int i=0; i<n; i++) {
    for (int j=0; j<m; j++) {
      tmp[i][j] = map[i][j];
    }
  }
 
  while (simulation(tmp, n, m)) {
    ;
  }
 
  for (int i=0; i<n; i++) {
    for (int j=0; j<m; j++) {
      if (tmp[i][j] == 0) {
        count++;
      }
    }
  }
  return count;
}
 
int main(void) {
  int n, m, map[8][8], max = 0;
 
  scanf("%d %d", &n, &m);
  for (int i=0; i<n; i++) {
    for (int j=0; j<m; j++) {
      scanf("%d", &map[i][j]);
    }
  }
 
  for (int i=0; i<n*m; i++) {
    for (int j=i+1; j<n*m; j++) {
      for (int k=j+1; k<n*m; k++) {
        if (map[i/m][i%m] != 0 || map[j/m][j%m] != 0 || map[k/m][k%m] != 0) continue;
        map[i/m][i%m] = 1;
        map[j/m][j%m] = 1;
        map[k/m][k%m] = 1;
        int tmp = calc(map, n, m);
        max = tmp > max ? tmp : max;
        map[i/m][i%m] = 0;
        map[j/m][j%m] = 0;
        map[k/m][k%m] = 0;
      }
    }
  }
 
  printf("%d", max);
  return 0;
}