zoukankan      html  css  js  c++  java
  • POJ 2446 Chessboard

    Chessboard

    Time Limit: 2000ms
    Memory Limit: 65536KB
    This problem will be judged on PKU. Original ID: 2446
    64-bit integer IO format: %lld      Java class name: Main
    Alice and Bob often play games on chessboard. One day, Alice draws a board with size M * N. She wants Bob to use a lot of cards with size 1 * 2 to cover the board. However, she thinks it too easy to bob, so she makes some holes on the board (as shown in the figure below). 

    We call a grid, which doesn’t contain a hole, a normal grid. Bob has to follow the rules below: 
    1. Any normal grid should be covered with exactly one card. 
    2. One card should cover exactly 2 normal adjacent grids. 

    Some examples are given in the figures below: 
     
    A VALID solution.

     
    An invalid solution, because the hole of red color is covered with a card.

     
    An invalid solution, because there exists a grid, which is not covered.

    Your task is to help Bob to decide whether or not the chessboard can be covered according to the rules above.
     

    Input

    There are 3 integers in the first line: m, n, k (0 < m, n <= 32, 0 <= K < m * n), the number of rows, column and holes. In the next k lines, there is a pair of integers (x, y) in each line, which represents a hole in the y-th row, the x-th column.
     

    Output

    If the board can be covered, output "YES". Otherwise, output "NO".
     

    Sample Input

    4 3 2
    2 1
    3 3
    

    Sample Output

    YES

    Hint

     
    A possible solution for the sample input.
     

    Source

     
    解题:最大匹配
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 const int maxn = 33*33;
     7 bool mp[maxn][maxn],used[maxn],cant[50][50];
     8 int Link[maxn],n,m,k;
     9 bool match(int u){
    10     for(int i = 0; i < maxn; ++i){
    11         if(!mp[u][i] || used[i]) continue;
    12         used[i] = true;
    13         if(Link[i] == -1 || match(Link[i])){
    14             Link[i] = u;
    15             return true;
    16         }
    17     }
    18     return false;
    19 }
    20 int main(){
    21     int x,y;
    22     while(~scanf("%d%d%d",&n,&m,&k)){
    23         memset(cant,false,sizeof cant);
    24         for(int i = 0; i < k; ++i){
    25             scanf("%d%d",&y,&x);
    26             cant[x-1][y-1] = true;
    27         }
    28         memset(mp,false,sizeof mp);
    29         for(int i = 0; i < n; ++i){
    30             for(int j = 0; j < m; ++j){
    31                 if(((i+j)&1) && !cant[i][j]){
    32                     if(i > 0 && !cant[i-1][j]) mp[i*m + j][(i-1)*m + j] = true;
    33                     if(j > 0 && !cant[i][j-1]) mp[i*m + j][i*m + j - 1] = true;
    34                     if(i + 1 < n && !cant[i+1][j]) mp[i*m + j][(i+1)*m + j] = true;
    35                     if(j + 1 < m && !cant[i][j+1]) mp[i*m + j][i*m + j + 1] = true;
    36                 }
    37             }
    38         }
    39         int ret = 0;
    40         memset(Link,-1,sizeof Link);
    41         for(int i = 0; i <= m*n; ++i){
    42             memset(used,false,sizeof used);
    43             if(match(i)) ++ret;
    44         }
    45         printf("%s
    ",n*m - k == 2*ret?"YES":"NO");
    46     }
    47     return 0;
    48 }
    View Code
  • 相关阅读:
    多表联合查询,利用 concat 模糊搜索
    order by 中利用 case when 排序
    Quartz.NET 3.0.7 + MySql 动态调度作业+动态切换版本+多作业引用同一程序集不同版本+持久化+集群(一)
    ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述
    ASP.NET Core 2.2 基础知识(十七) SignalR 一个极其简陋的聊天室
    ASP.NET Core 2.2 基础知识(十六) SignalR 概述
    ASP.NET Core 2.2 基础知识(十五) Swagger
    ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
    linux磁盘管理 磁盘查看操作
    linux磁盘管理 文件挂载
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4854144.html
Copyright © 2011-2022 走看看