#include <string>
#include <vector>

using namespace std;

struct coordinate{
    int x;
    int y;
    coordinate() : y(0), x(0) {}
    coordinate(int c1, int c2) : y(c1), x(c2) {}
};

typedef struct coordinate coordinate;

long long solution(vector<string> grid) {
    long long answer = 0;
    coordinate p, p1, p2, siz;
    siz.x=0;
    siz.y=0;
    int i=0;
    
    //map 크기
    while(1){
        if(grid.size()==i || !grid[i++][0]){
            siz.y=i;
            break;
        }
    }
    i=0;
    while(1){
        if(grid[0].size()==i || !grid[0][i++]){
            siz.x=i;
            break;
        }
    }
    
    //눈덩이 위치
    for(i=0; i<siz.y; i++){
        for(int j=0; j<siz.x; j++){
            if(grid[i][j]=='o'){
                if(p1.x==0) p1.x=j;
                else p2.x=j;
                if(p1.y==0) p1.y=i;
                else p2.y=i;
                if(p1.x&&p2.x) break;
            }
        }
    }
    
    //공용 맵
    vector<vector<int>> map(siz.y, vector<int>(siz.x,0));
    vector<vector<coordinate>> list;
    int seed;
    int num;
    int ch;
    
    //영역 1
    vector<vector<int>> map1(siz.y, vector<int>(siz.x,0));
    list.resize(2,vector<coordinate>());
    list[0].push_back({p1.y, p1.x});
    int map1siz=1;
    seed=0;
    num=2;
    ch=1;
    map1[p1.y][p1.x]=1;
    map[p1.y][p1.x]+=1;
    while(ch){
        ch=0;
        for(i=0;i<list[seed].size();i++){
            p=list[seed][i];
            
            if(p.x+1<siz.x && grid[p.y][p.x+1]=='.' && map1[p.y][p.x+1]==0){
                map1[p.y][p.x+1]=num;
                map[p.y][p.x+1]+=1;
                list[(seed+1)%2].push_back({p.y, p.x+1});
                ch++;
            }
            
            if(p.x-1>=0 && grid[p.y][p.x-1]=='.' && map1[p.y][p.x-1]==0){
                map1[p.y][p.x-1]=num;
                map[p.y][p.x-1]+=1;
                list[(seed+1)%2].push_back({p.y, p.x-1});
                ch++;
            }
            
            if(p.y+1<siz.y && grid[p.y+1][p.x]=='.' && map1[p.y+1][p.x]==0){
                map1[p.y+1][p.x]=num;
                map[p.y+1][p.x]+=1;
                list[(seed+1)%2].push_back({p.y+1, p.x});
                ch++;
            }
            
            if(p.y-1>=0 && grid[p.y-1][p.x]=='.' && map1[p.y-1][p.x]==0){
                map1[p.y-1][p.x]=num;
                map[p.y-1][p.x]+=1;
                list[(seed+1)%2].push_back({p.y-1, p.x});
                ch++;
            }
        }
        map1siz+=ch;
        num++;
        list[seed].clear();
        seed=(seed+1)%2;
    }
    
    //영역 2
    vector<vector<int>> map2(siz.y, vector<int>(siz.x,0));
    list.resize(2,vector<coordinate>());
    list[0].push_back({p2.y, p2.x});
    int map2siz=1;
    seed=0;
    num=2;
    ch=1;
    map2[p2.y][p2.x]=1;
    map[p2.y][p2.x]+=2;
    while(ch){
        ch=0;
        for(i=0;i<list[seed].size();i++){
            p=list[seed][i];
            
            if(p.x+1<siz.x && grid[p.y][p.x+1]=='.' && map2[p.y][p.x+1]==0){
                map2[p.y][p.x+1]=num;
                map[p.y][p.x+1]+=2;
                list[(seed+1)%2].push_back({p.y, p.x+1});
                ch++;
            }
            
            if(p.x-1>=0 && grid[p.y][p.x-1]=='.' && map2[p.y][p.x-1]==0){
                map2[p.y][p.x-1]=num;
                map[p.y][p.x-1]+=2;
                list[(seed+1)%2].push_back({p.y, p.x-1});
                ch++;
            }
            
            if(p.y+1<siz.y && grid[p.y+1][p.x]=='.' && map2[p.y+1][p.x]==0){
                map2[p.y+1][p.x]=num;
                map[p.y+1][p.x]+=2;
                list[(seed+1)%2].push_back({p.y+1, p.x});
                ch++;
            }
            
            if(p.y-1>=0 && grid[p.y-1][p.x]=='.' && map2[p.y-1][p.x]==0){
                map2[p.y-1][p.x]=num;
                map[p.y-1][p.x]+=2;
                list[(seed+1)%2].push_back({p.y-1, p.x});
                ch++;
            }
        }
        map2siz+=ch;
        num++;
        list[seed].clear();
        seed=(seed+1)%2;
    }
    
    //최단거리 합
    p=p1;
    int minsum=1;
    while(1){
        ch=0;
        num=1000;
        if(p.x+1<siz.x && map2[p.y][p.x+1] && map2[p.y][p.x+1]<num){
            num=map2[p.y][p.x+1];
            ch=1;
        }

        if(p.x-1>=0 && map2[p.y][p.x-1] && map2[p.y][p.x-1]<num){
            num=map2[p.y][p.x-1];
            ch=2;
        }

        if(p.y+1<siz.y && map2[p.y+1][p.x] && map2[p.y+1][p.x]<num){
            num=map2[p.y+1][p.x];
            ch=3;
        }

        if(p.y-1>=0 && map2[p.y-1][p.x] && map2[p.y-1][p.x]<num){
            num=map2[p.y-1][p.x];
            ch=4;
        }
        if(ch==0) break;
        if(ch==1){
            p.x++;
        }
        if(ch==2){
            p.x--;
        }
        if(ch==3){
            p.y++;
        }
        if(ch==4){
            p.y--;
        }
        minsum++;
        if(p.x==p2.x && p.y==p2.y) break;
    }
    
    //최대 합
    int maxsum=0;
    for(i=0;i<siz.y;i++){
        for(int j=0;j<siz.x;j++){
            if(map[i][j]){
                maxsum++;
            }
        }
    }
    
    return maxsum;
    return answer;
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: