zoukankan      html  css  js  c++  java
  • CH6901 骑士放置

    描述

    给定一个 N*M 的棋盘,有一些格子禁止放棋子。问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的“骑士”,类似于中国象棋的“马”,按照“日”字攻击,但没有中国象棋“别马腿”的规则)。N, M<=100。

    输入格式

    第一行为n,m,t(表示有t个禁止的格子)
    第二行到t+1行为x,y,分别表示禁止格子所在的位置,x为第x行,y为第y列,行列编号从1开始。 

    输出格式

    一个整数,表示最多能放多少个骑士。

    样例输入

    2 3 0

    样例输出

    4
            </article>
    

    题解

    跳“日”字时行列号之和的该变量为奇数,所以这是二分图。

    那么求的就是二分图最大独立集,等于点数减去最大匹配数。时间复杂度(O(n^2m^2))

    #include<bits/stdc++.h>
    #define rg register
    #define il inline
    #define co const
    template<class T>il T read(){
        rg T data=0,w=1;rg char ch=getchar();
        for(;!isdigit(ch);ch=getchar())if(ch=='-') w=-w;
        for(;isdigit(ch);ch=getchar()) data=data*10+ch-'0';
        return data*w;
    }
    template<class T>il T read(rg T&x) {return x=read<T>();}
    typedef long long ll;
    using namespace std;
    
    co int N=101;
    int n,m,t,ans,fx[N][N],fy[N][N];
    bool a[N][N],v[N][N];
    co int dx[8]={-2,-2,-1,-1,1,1,2,2};
    co int dy[8]={-1,1,-2,2,-2,2,-1,1};
    bool dfs(int x,int y){
    	for(int i=0;i<8;++i){
    		int nx=x+dx[i],ny=y+dy[i];
    		if(nx<1||nx>n||ny<1||ny>m||a[nx][ny]||v[nx][ny]) continue;
    		v[nx][ny]=1;
    		if(!fx[nx][ny]||dfs(fx[nx][ny],fy[nx][ny])){
    			fx[nx][ny]=x,fy[nx][ny]=y;
    			return 1;
    		}
    	}
    	return 0;
    }
    int main(){
    	read(n),read(m),read(t);
    	for(int i=1;i<=t;++i) a[read<int>()][read<int>()]=1;
    	for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){
    		if(i+j&1||a[i][j]) continue;
    		memset(v,0,sizeof v);
    		ans+=dfs(i,j);
    	}
    	printf("%d
    ",n*m-t-ans);
    	return 0;
    }
    
  • 相关阅读:
    漫谈程序员系列:咦,你也在混日子啊
    JVM加载class文件的原理机制
    maven编译的时候排除junit测试类
    mysql之——存储过程 + 游标 + 事务
    JSP页面之${fn:}内置函数
    生成24位字符串ID__IdGenerator.java
    oracle创建用户,表空间,虚拟路径,导入dbf
    eclipse手动修改默认工作空间
    资源
    http协议发送header+body+json及接收解析
  • 原文地址:https://www.cnblogs.com/autoint/p/10972650.html
Copyright © 2011-2022 走看看