hungary

棋盘覆盖

https://ac.nowcoder.com/acm/problem/51272

#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> PII;
#define fi first
#define se second

const int N=105;
int n, m;
PII match[N][N];
bool g[N][N], vis[N][N]; // hungary 标记数组
int dirs[4][2]={{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // 定义方向向量

bool find(int x, int y){ // hungary find function
    for(int i=0; i<4; ++i){
        int nx=x+dirs[i][0];
        int ny=y+dirs[i][1];
        if(nx && nx<=n && ny && ny<=n && !g[nx][ny] && !vis[nx][ny]){
            vis[nx][ny]=true;
            PII t=match[nx][ny];
            if(t.fi==-1 || find(t.fi, t.se)){
                match[nx][ny]={x, y};
                return true;
            }
        }
    }
    return false;
}

int main(){
    cin>>n>>m;
    while(m--){
        int x, y;
        cin>>x>>y;
        g[x][y]=true; // 读入障碍坐标
    }

    memset(match, -1, sizeof match);
    int ans=0;
    // 将图进行2-染色(0, 0)设置为黑色
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=n; ++j)
            if((i+j)&0x01 && !g[i][j]){ // 如果是白色格子并且可以无障碍
                memset(vis, 0x00, sizeof vis);
                if(find(i, j)) ans++;
            }
    cout<<ans<<endl;
    return 0;
}
全部评论

相关推荐

07-18 15:02
门头沟学院 Java
刚打开网申页面就不想填了,还是不要为难自己了
poppinzhan...:多益老行业毒瘤了,碰到徐波这种恶心的烂人,去了也是受罪。
点赞 评论 收藏
分享
自学java狠狠赚一...:骗你点star的,港卵公司,记得把star收回去
点赞 评论 收藏
分享
06-26 17:24
已编辑
宁波大学 golang
迷失西雅图:别给,纯kpi,别问我为什么知道
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务