首页 > 其他分享 >D - Grid and Magnet

D - Grid and Magnet

时间:2024-04-28 22:00:29浏览次数:26  
标签:magnet int cell ynew Magnet field Grid xnew

D - Grid and Magnet

https://atcoder.jp/contests/abc351/tasks/abc351_d

 

思路

定义输入矩阵元素值

    s matrix each cell can have three possible values:
        0 - emtpy and not magnet field
        1 - magnet
        2 - magnet field

输入的时候,只标记 0 1

然后遍历 所有magnet cell, 将其周边 empty cell 标记为 2 - magnet field

 

以magnet fields border 将整个图 分割为若干个 连通子图, 这些连通子图元素都为 empty cells

bfs方法统计每个连通子图的 自由度 = empty cells 数目 + border cells 数目。

取最大值。

 

参考图

https://blog.csdn.net/weixin_73550568/article/details/138259299

 

 

Code

https://atcoder.jp/contests/abc351/submissions/52921148

int h, w;

int s[1005][1005];
bool v[1005][1005];

vector<pair<int, int>> dirs = {
    {0, 1},
    {0, -1},
    {1, 0},
    {-1, 0},
};

int main()
{
    cin >> h >> w;

    for(int i=0; i<h; i++){
        string oneline;
        cin >> oneline;
        
        for(int j=0; j<w; j++){
            char one = oneline[j];
            
            if (one == '#'){
                s[i][j] = 1;
            } else {
                s[i][j] = 0;
            }
        }
    }

    auto mark_magnet_fields = [&](int x, int y) -> void{
        // current position is not magnet
        if (s[x][y] != 1){
            return;
        }
        
        for(auto onedir: dirs){
            int xstep = onedir.first;
            int ystep = onedir.second;
            
            int xnew = x + xstep;
            int ynew = y + ystep;
            
            // out of grid, skip
            if (xnew < 0 || xnew >= h || ynew < 0 || ynew >= w){
                continue;
            }
            
            // only empty cell can be marked as magnet field
            // so if the neighbor cell is magnet or magnet field, skip
            if (s[xnew][ynew] != 0){
                continue;
            }
            
            s[xnew][ynew] = 2;
        }
    };

    /*
    s matrix each cell can have three possible values:
        0 - emtpy and not magnet field
        1 - magnet
        2 - magnet field
    */
    // mark magnet field
    for(int i=0; i<h; i++){
        for(int j=0; j<w; j++){
            /* current cell must be magnet */
            if (s[i][j] != 1){
                continue;
            }
            
            mark_magnet_fields(i, j);
        }
    }

    /*
    transverse all the possible connected graphs
    to get max degree
    */
    /*
    for sample 2, it tell us no empty cells exists,
    i.e. all cells can not move,
    so set default value as 1 to represent this case
    -----------
    3 3
    ..#
    #..
    ..#
    */
    int maxd = 1;
    
    auto bfs = [&](int i, int j) -> int {
        int cnt = 0;
        
        queue<pair<int, int>> qq;
        
        map<int, map<int, bool>> inqued;
        
        qq.push({i, j});
        inqued[i][j] = true;
        
        while(!qq.empty()){
            pair<int, int> front = qq.front();
            qq.pop();
            
            cnt++;
            
            int x = front.first;
            int y = front.second;
            
            // magnet field
            // other type is empty cell
            if (s[x][y] == 2){
                // DO NOTHING
                continue;
            }
            
            v[x][y] = true;

            for(auto onedir: dirs){
                int xstep = onedir.first;
                int ystep = onedir.second;

                int xnew = x + xstep;
                int ynew = y + ystep;

                // out of grid, skip
                if (xnew < 0 || xnew >= h || ynew < 0 || ynew >= w){
                    continue;
                }

                // only empty or magnet field cell can be inque
                // so if the neighbor cell is magnet, skip
                if (s[xnew][ynew] == 1){
                    continue;
                }
                
                if (inqued[xnew][ynew]){
                    continue;
                }

                qq.push({xnew, ynew});
                inqued[xnew][ynew] = true;
            }
        }
        
        return cnt;
    };
    
    for(int i=0; i<h; i++){
        for(int j=0; j<w; j++){
            /* current cell must be empty */
            if (s[i][j] != 0){
                continue;
            }
            
            // if empty cell visited, skip
            if (v[i][j]){
                continue;
            }

            int freed = bfs(i, j);
            
            maxd = max(maxd, freed);
        }
    }

    cout << maxd << endl;

    return 0;
}

 

标签:magnet,int,cell,ynew,Magnet,field,Grid,xnew
From: https://www.cnblogs.com/lightsong/p/18164590

相关文章

  • 【BFS】abc351D Grid and Magnet 题解
    传送门D-GridandMagnet题意:给定h行w列的图表,其中部分位置有磁铁,人物会在磁铁四周((x+1,y),(x-1,y),(x,y+1),(x,y-1))停止,某点的自由度定义为从该点出发最多可到的方块数目可以走重复路前置例题:求连通块大小洛谷P1141思路:由自由度的定义联想到连通块的大小,从而决定用BFS......
  • [abc 351] [D - Grid and Magnet]
    搜索importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.math.BigInteger;importjava.util.*;publicclassMain{staticinth;staticintw;staticchar[][]board;staticboolean[][]......
  • WPF自定义FixedColumnGrid布局控件
    按照上一节所讲,我已经对布局系统又所了解。接下来我就实现一个布局控件FixedColumnGrid。1.基础版布局控件机制如下,FixedColumnGrid将子控件按照水平排列,每行满两列后换行。每个控件大小相同,高度固定为50。第一步,先重载测量和排列方法protectedoverrideSizeMeasureOverrid......
  • grid布局的基本使用
    1、首先需要在父容器中设置display属性display:grid//设置容器中子元素为栅格布局2、其次最重要的就是确定容器中行数和列数,通过行数和列数形成具体的网格状布局,这也是栅格布局的由来由两个属性grid-template-columns和grid-template-row来分别决定行数和列数grid-temp......
  • HarmonyOS NEXT 实战开发—Grid和List内拖拽交换子组件位置
    介绍本示例分别通过onItemDrop()和onDrop()回调,实现子组件在Grid和List中的子组件位置交换。效果图预览使用说明:拖拽Grid中子组件,到目标Grid子组件位置,进行两者位置互换。拖拽List中子组件,到目标List子组件位置,进行两者位置互换。实现思路在Grid组件中,通过editMode()打......
  • Devexpress GridControl下拉框实现联动
    实现效果1.先在设计界面绑定数据列1.点击设计器2.绑定数据列2.绑定GridView的FocusedRowChanged事件//定义两个下拉框_RIcmbtype:不良分类_RIcmbdefect:不良信息RepositoryItemComboBox_RIcmbtype=newRepositoryItemComboBox();RepositoryItemComboBox......
  • c# 中 dataGridView控件 显示水平滚动条
    1.最主要的在dataGridView控件属性中的ScrollBars是否设为BothBoth代表水平和垂直方向根据实际需求自动显示滚动条None代表水平和垂直都不显示滚动条Vertical代表只垂直显示滚动条Horizontal代表只水平显示滚动条2.检查表格中每个列的属性,看Frozen应设置为false 如果......
  • 【转】[C#][WPF] GridControl 列宽控制
    在设置DevExpress里的GridControl自动列宽时,有两个方式:view.BestFitColumn(gridColumn);view.BestFitColumns();但我想要达到这样的效果:1、加载配置,读取列宽2、未配置列宽的列自动列宽发现可以这样组合://如果已配置列宽,自动列宽就是配置的宽度if(gridColumn.Widt......
  • DEV+GridControl实现反选
    最近在使用Dev+Winform,看了很多资料都是些复制粘贴,可能作者也没实践过,自己就记录总结下,也特别简单 主要代码,///<summary>///反选///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidsimpleButton5_Cl......
  • GridControl列自动匹配宽度(转)
    //自动调整所有字段宽度this.gridView1.BestFitColumns();//调整某列字段宽度this.gridView1.Columns[n].BestFit(); 大多是网上零散找到的,小部分是自己使用的时候自己遇到的。 XtraGrid的关键类就是:GridControl和GridView。GridControl本身不显示数据,数据都是显示在Grid......