zoukankan      html  css  js  c++  java
  • 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 } 
    我自倾杯,君且随意
  • 相关阅读:
    AD 文档信息设置和制作模板
    用AT命令调试调制解调器
    语音AT命令参考
    传真AT指令部分(参考)
    传真调制解调器
    knockout+weui+zepto
    20171028随手记
    20171027随记
    一些简单又坑人的无聊使用
    ReadWrite,日志,输入文本
  • 原文地址:https://www.cnblogs.com/nicetomeetu/p/5507100.html
Copyright © 2011-2022 走看看