POJ_2446_Chessboard
题目意思就是一个M*N的有洞棋盘棋盘上,用1*2的板子去覆盖没有洞的地方,要求板子不能重叠,最终能否将棋盘完整覆盖。
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 35 struct z
{
int color;
int ct;
};
struct z chess[MAX*MAX];
int lc,rc;
int m,n;a
__int64 hole[MAX*MAX];
__int64 G[MAX*MAX][MAX*MAX];
__int64 link[MAX*MAX];
__int64 vis[MAX*MAX];
int zero=,one=;/*分别记录0,1的个数*/ int find(int);
void bin_map(void); int main(void)
{
int k,i,j;
int x,y;
scanf("%d%d%d",&m,&n,&k);
for(i=; i<k; i++)
{
scanf("%d%d",&x,&y);
hole[n*(y-)+x]=;
}
if(n&)
for(j=,i=; i<=m*n; i++)
{
if(hole[i]==)
{
chess[i].color=j=!j;
if(j)
chess[i].ct=++one;
else
chess[i].ct=++zero;
}
else
{
chess[i].color=-;
j=!j;
}
}
else
for(j=,i=; i<=m*n; i++)
{
if(hole[i]==)
{
chess[i].color=!j;
if(!j)
chess[i].ct=++one;
else chess[i].ct=++zero;
}
else
chess[i].color=-;
if(i%n)
j=!j;
}
bin_map();
int ans=;
for(i=; i<=zero; i++)
{
memset(vis,,sizeof(vis));
if(find(i))
ans++;
}
if(*ans==m*n-k)
puts("YES");
else puts("NO");
return ;
} void bin_map(void)
{
int i;
for(i=; i<=m*n; i++)
{
if(chess[i].color==)
{
if(i%n!=&&chess[i-].color==)
G[chess[i].ct][chess[i-].ct]=;
if(i%n&&chess[i+].color==)
G[chess[i].ct][chess[i+].ct]=;
if(i>n&&chess[i-n].color==)
G[chess[i].ct][chess[i-n].ct]=;
if(i<=m*n-n&&chess[i+n].color==)
G[chess[i].ct][chess[i+n].ct]=;
}
}
}
int find(int x)
{
int i;
for(i=; i<=one; i++)
{
if(G[x][i]&&!vis[i])
{
vis[i]=;
if(link[i]==||find(link[i]))
{
link[i]=x;
return ;
}
}
}
return ;
}
我的思路大致是这样:
由于是将棋盘相邻两区域覆盖,所以可将棋盘黑白相间的涂色,然后再挖去相应的洞,这样,将白色的作为一个二分图节点子集,剩下的作为另一个子集,然后相邻的黑白块代表的顶点在二分图中连接起来,然后求出二分图的额最大匹配数,便是最多能够放置的板子。
POJ_2446_Chessboard的更多相关文章
随机推荐
- thinkphp中关于rbac的两个session
最近在做单点登录,需要session由sso的client生成.所以研究了下RBAC的类的代码. 有了这两个seesion就可以用rbac进行权限验证 $_SESSION[C('ADMIN_AUTH_ ...
- IE6下Png透明最佳解决方案(推荐) Unit PNG Fix
引自:http://www.yeeyan.org/articles/view/98510/67784 网络上解决IE6下Png透明解决方案有很多,例如 IE PNG Fix from TwinHeli ...
- 教你记住ASP.NET WebForm页面的生命周期
对于ASP.NET Webform的开发者,理解ASP.NET Webform的页面生命周期是非常重要的.主要是为了搞明白在哪里放置特定的方法和在何时设置各种页面属性.但是记忆和理解页面生命周期里提供 ...
- SQL的update from 理解
学习了sql的语句都有快3年,工作上使用都一年半的,最近突然想起update from语句,感觉好像很模糊,虽然语法上使用一直正确,一直都是这样使用,但是就好像不是很明白里面的深处意思. 今天特意测试 ...
- mysql更改root密码及root远程登录
1.更改root密码 use mysql; update user set password=password('petecc') where user='root'; 2.root远程登录 1 up ...
- AppDelegate 方法详解
iOS 程序启动时总会调用application:didFinishLaunchingWithOptions:,其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有 ...
- iOS9 UITableViewCell separatorInset设置为0分割线还是没有顶到头的问题
只需要在自定义的Cell中添加以下代码即可 override func awakeFromNib() { super.awakeFromNib() layoutMargins = UIEdgeInse ...
- 浅谈c#接口的问题,适合新手来了解
这段时间的项目有用到接口,开始不是特别理解接口,只是单单知道接口定义非常简单,甚至觉得这个接口只是多此一举(个人开发的时候).现在开始团队开发,才发现接口原来是这么的重要和便捷! 接下来就来谈谈我这段 ...
- VB,VBS,VBA,ASP可引用的库参考
文件系统对象相关: ("SCRIPTING.FILESYSTEMOBJECT") 字典相关: ("SCRIPTING.DICTIONARY") 脚本外壳相关: ...
- webService学习记录
服务端配置1.新建web项目,导入xFire的jar包2.创建服务接口.实现类3.创建src->META-INF->service->service.xml 将实现类.接口配置到里面 ...