POJ 2446 Chessboard
来源:互联网 发布:用户运营数据挖掘 编辑:程序博客网 时间:2024/05/22 01:34
Chessboard
题意:一个n*m的矩阵方格,其中有k个1*1的小方格不能使用,问剩下的是否能恰好用1*2的方格铺满
思路:二分图的最大匹配 匈牙利算法(如果还不了解匈牙利算法的话可以看看这篇博客,写的很好)
解题方法:要点1:一个1*2的方块可分成两个1*1的小方块,这两个小方块的横纵坐标和必定一个为奇数一个为偶数
要点2:将奇数的小方块作为二分图的左边,然后去找能够与它组成1*2的方块(也就是与它相邻的)构成二分图的右边
要点3:判断是否满足恰好能铺满
具体见代码:
#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define N 35int id[N][N],vis[N*N],GG[N*N][N*N],G[N][N],Left[N*N];int way[][2]={1,0,-1,0,0,1,0,-1};int totL,totR;void init(){ memset(G,0,sizeof(G)); memset(GG,0,sizeof(GG)); memset(id,-1,sizeof(id)); memset(Left,-1,sizeof(Left)); totL=totR=0;}bool match(int u){ for(int i=0;i<totR;i++){ if(GG[u][i]&&!vis[i]){ vis[i]=1; if(Left[i]==-1||match(Left[i])){ Left[i]=u; return true; } } } return false;}int hungary(){ int tot=0; for(int i=0;i<totL;i++){ memset(vis,0,sizeof(vis)); if(match(i)) tot++; } return tot;}int main(){ int x,y,n,m,k; while(scanf("%d%d%d",&n,&m,&k)!=EOF){ init(); for(int i=0;i<k;i++){ scanf("%d%d",&x,&y); G[y-1][x-1]=1; } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(!G[i][j]){ if((i+j)%2){ id[i][j]=totL; totL++; }else{ id[i][j]=totR; totR++; } } } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if( (!G[i][j]) && ((i+j)%2) ){ for(int k=0;k<4;k++){ x=i+way[k][0]; y=j+way[k][1]; if(x>=0&&x<n&&y>=0&&y<m&&!G[x][y]){ GG[id[i][j]][id[x][y]] =1; } } } } } if( ((n*m-k)%2)||(totL!=totR) ) printf("NO\n"); else{ printf("%s\n",hungary()*2==(n*m-k)?"YES":"NO"); } } return 0;}
0 0
- POJ 2446 Chessboard
- poj 2446 Chessboard
- POJ-2446 Chessboard
- poj 2446 Chessboard
- POJ 2446 Chessboard
- POJ 2446 Chessboard
- POJ 2446 Chessboard
- poj 2446 Chessboard
- POJ 2446 Chessboard
- poj 2446:Chessboard
- poj 2446 Chessboard
- [poj 2446]Chessboard
- poj 2446 Chessboard (Hungary Algorithm)
- poj 2446(二分匹配) Chessboard
- Poj-2446 Chessboard 二分匹配
- 【POJ】2446 Chessboard 二分匹配
- POJ 2446 Chessboard 最大匹配
- poj 2446 Chessboard(二分图)
- hdu4737A Bit Fun 线段树
- uva10534(DP之LIS的应用 )
- tomcat注册成服务
- 总结:Different Methods for Weight Initialization in Deep Learning
- 23种设计模式
- POJ 2446 Chessboard
- Android Acitivy切换平移动画效果实现
- 【ID搜索】uva12558Egyptian Fractions(HARD version) 埃及分数
- 股票学习(K线)
- Java 里使用 long 类型的数据一定要在数值后面加上 “L”
- Android小记:ViewStub的应用
- UI第一天
- iPad popView封装
- Objective-C 【OC和C的区别-面向对象-有参/无参方法-类和对象】