题目意思就是一个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的更多相关文章

随机推荐

  1. C#操控条形码扫描枪

    // 条码扫描器 // 窗体部分相关代码: using System; using System.Collections.Generic; using System.ComponentModel; u ...

  2. php 5.3+ 连接mssql

    php5.3+里已经没有mssql的dll扩展了,需要使用SQL Server Driver for PHP 这里有两个版本有两个版本支持不同的php版本. 1.SQL Server Driver f ...

  3. JAVA深入研究——Method的Invoke方法

    http://www.cnblogs.com/onlywujun/p/3519037.html 在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用 ...

  4. bzoj1090:[SCOI2003]字符串折叠

    思路:区间dp,令f[l][r]表示l到r的答案,于是f[l][r]=min(f[l][mid],f[mid+1][r]),如果能折叠f[l][r]=min(f[l][r],f[l][l+len-1] ...

  5. Installshield: custom action return value

    参考:MSDN: Custom Action Return Values 参考:MSDN: Logging of Action Return Values

  6. Sdut 2409 The Best Seat in ACM Contest(山东省第三届ACM省赛 H 题)(模拟)

    题目描述 Cainiao is a university student who loves ACM contest very much. It is a festival for him once ...

  7. c++primer复习(六)—面向对象编程

    1 C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定,两个条件(基类引用或指针.虚函数)缺一不可 虚函数的默认实参将发生静态绑定 2 继承层次的根类一般都需要定义虚析构函数 3 任意非st ...

  8. 九度OJ 1107 搬水果 -- 哈夫曼树 2011年吉林大学计算机研究生机试真题

    题目地址:http://ac.jobdu.com/problem.php?pid=1107 题目描述: 在一个果园里,小明已经将所有的水果打了下来,并按水果的不同种类分成了若干堆,小明决定把所有的水果 ...

  9. centOS 6.4 vsftpd 配置

    ###########配置流程########### 1 新建一个ftp用户,为了跟vsftp的虚拟用户对应 #useradd  -d /home/vftpuser   -s /sbin/nologi ...

  10. Android学习7--日志信息的使用

    在代码的调试中,日志信息是必不可少的,关于日志信息的使用,接下来,小编简要的说明一下: 日志分为几种:Verbose:从字面上解释,verbose为冗长的,啰嗦的,所以verbose日志信息输出的内容 ...