POJ 2446 Chessboard

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

二分图匹配

 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 } 

 

posted @ 2016-05-18 23:21  nicetomeetu  阅读(127)  评论(0编辑  收藏  举报