fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n, m, a[10][10], visited[10][10], ret;
  4. vector<pair<int, int>> wallList, virusList;
  5. int dy[] = {-1, 0, 1, 0};
  6. int dx[] = {0, 1, 0, -1};
  7.  
  8. void dfs(int y, int x){
  9. if(a[y][x] == 1) return;
  10. visited[y][x] = 1;
  11. for(int i = 0; i < 4; i++){
  12. int ny = y + dy[i];
  13. int nx = x + dx[i];
  14. if(ny < 0 || ny >= n || nx < 0 || nx >= m || visited[ny][nx]) continue;
  15. dfs(ny, nx);
  16. }
  17. }
  18.  
  19. int solve(){
  20. fill(&visited[0][0], &visited[0][0] + 10 * 10, 0);
  21. for(auto b : virusList){
  22. dfs(b.first, b.second);
  23. }
  24. int cnt = 0;
  25. for(int i = 0; i < n; i++){
  26. for(int j = 0; j < m; j++){
  27. if(!visited[i][j] && a[i][j] == 0) cnt++;
  28. }
  29. }
  30. return cnt;
  31. }
  32.  
  33. int main(){
  34. cin >> n >> m;
  35. for(int i = 0; i < n; i++){
  36. for(int j = 0; j < m; j++){
  37. cin >> a[i][j];
  38. if(a[i][j] == 0) wallList.push_back({i, j});
  39. else if(a[i][j] == 2) virusList.push_back({i, j});
  40. }
  41. }
  42. for(int i = 0; i < wallList.size(); i++){
  43. for(int j = 0; j < i; j++){
  44. for(int k = 0; k < j; k++){
  45. a[wallList[i].first][wallList[i].second] = 1;
  46. a[wallList[j].first][wallList[j].second] = 1;
  47. a[wallList[k].first][wallList[k].second] = 1;
  48. ret = max(ret, solve());
  49. a[wallList[i].first][wallList[i].second] = 0;
  50. a[wallList[j].first][wallList[j].second] = 0;
  51. a[wallList[k].first][wallList[k].second] = 0;
  52. }
  53. }
  54. }
  55. cout << ret << '\n';
  56. }
Success #stdin #stdout 0.01s 5320KB
stdin
7 7
2 0 0 0 1 1 0
0 0 1 0 1 2 0
0 1 1 0 1 0 0
0 1 0 0 0 0 0
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 1 0 0 0 0 0
stdout
27