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 }
我自倾杯,君且随意