码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2446 Chessboard

时间:2016-05-19 00:08:15      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

要求用占两格的长方形铺满平面上除去指定点

二分图匹配

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 int dx[]={1,-1,0,0};
 6 int dy[]={0,0,1,-1};
 7 int map[40][40];
 8 int vis[40][40];
 9 int link[40*40];
10 int m,n,k;
11 bool check(int x,int y)
12 {
13     return 0<=x&&x<m&&0<=y&&y<n;
14 }
15 bool dfs(int t)
16 {
17     int nx,ny,nxt;
18     for(int i=0;i<4;i++)
19     {
20         nx=t/n+dx[i];
21         ny=t%n+dy[i];
22         if(check(nx,ny)&&!map[nx][ny]&&!vis[nx][ny])
23         {
24             vis[nx][ny]=1;
25             nxt=nx*n+ny;
26             if(link[nxt]==-1||dfs(link[nxt]))
27             {
28                 link[nxt]=t;
29                 return 1;
30             } 
31         }
32     }
33     return 0;
34 }
35 int main()
36 {
37     int a,b;
38     while(~scanf("%d%d%d",&m,&n,&k))
39     {
40         memset(map,0,sizeof(map));
41         for(int i=0;i<k;i++)
42         {
43             scanf("%d%d",&b,&a);
44             a--; b--; 
45             map[a][b]=1;
46         }
47         int ans=0;
48         memset(link,-1,sizeof(link));
49         for(int i=0;i<m;i++)
50         {
51             for(int j=0;j<n;j++)
52             {
53                 memset(vis,0,sizeof(vis));
54                 if(!map[i][j] && dfs(i*n+j)) ans++;
55             }
56         }
57         if(ans==n*m-k) puts("YES");
58         else puts("NO");
59     }
60 } 

 

POJ 2446 Chessboard

标签:

原文地址:http://www.cnblogs.com/nicetomeetu/p/5507100.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!