zoukankan      html  css  js  c++  java
  • hdu------1281 棋盘游戏(最小覆盖点)

    棋盘游戏

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 2492    Accepted Submission(s): 1452


    Problem Description
    小 希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是 Gardon限制了只有某些格子才可以放,小希还是很轻松的解决了这个问题(见下图)注意不能放车的地方不影响车的互相攻击。
    所以现在 Gardon想让小希来解决一个更难的问题,在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量 多的“车”被放下。但是某些格子若不放子,就无法保证放尽量多的“车”,这样的格子被称做重要点。Gardon想让小希算出有多少个这样的重要点,你能解 决这个问题么?
     
    Input
    输入包含多组数据,
    第一行有三个数N、M、K(1<N,M<=100 1<K<=N*M),表示了棋盘的高、宽,以及可以放“车”的格子数目。接下来的K行描述了所有格子的信息:每行两个数X和Y,表示了这个格子在棋盘中的位置。
     
    Output
    对输入的每组数据,按照如下格式输出:
    Board T have C important blanks for L chessmen.
     
    Sample Input
    3 3 4 1 2 1 3 2 1 2 2 3 3 4 1 2 1 3 2 1 3 2
     
    Sample Output
    Board 1 have 0 important blanks for 2 chessmen. Board 2 have 3 important blanks for 3 chessmen.
     
    Author
    Gardon
     
    Source
     
    Recommend
     
    详细的代码: 最小覆盖点=最大匹配
     
    代码:
     1 /*Problem : 1281 ( 棋盘游戏 )     Judge Status : Accepted
     2 RunId : 11517709    Language : C++    Author : huifeidmeng
     3 Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta*/
     4 
     5 #include<cstdio>
     6 #include<cstring>
     7 #include<cstdlib>
     8 using namespace std;
     9 const int maxn=105;
    10 static int cont=1;
    11 bool mat[maxn][maxn],vis[maxn];
    12 int chess[maxn];
    13  int n,m,k;
    14 int match(int x){
    15   for(int i=1;i<=m;i++){
    16     if(mat[x][i]&&!vis[i]){
    17       vis[i]=1;
    18      if(!chess[i]||match(chess[i])){
    19          chess[i]=x;
    20          return 1;
    21        }
    22      }
    23     }
    24   return 0;
    25 }
    26 int a[maxn*maxn],b[maxn*maxn];
    27 int main(){
    28    //freopen("test.in","r",stdin);
    29   while(scanf("%d%d%d",&n,&m,&k)!=EOF){
    30     memset(mat,0,sizeof(mat));
    31     memset(chess,0,sizeof(chess));
    32     for(int i=0;i<k;i++){
    33         scanf("%d%d",&a[i],&b[i]);
    34         mat[a[i]][b[i]]=1;
    35     }
    36     int ans=0;
    37     for(int i=1;i<=n;i++){
    38       memset(vis,0,sizeof(vis));
    39        ans+=match(i);
    40     }
    41     int res=0;  //重要点个数
    42   //判断一个点重不重要,去掉这个点看看对这个匹配有没有影响就行了
    43     for(int i=0;i<k;i++){
    44       memset(chess,0,sizeof(chess));
    45       mat[a[i]][b[i]]=0;  //拿掉那个点,再来一次匹配
    46       int val=0;
    47      for(int j=1;j<=n;j++){
    48        memset(vis,0,sizeof(vis));
    49         val+=match(j);
    50         }
    51        if(ans>val) res++;  //说明有影响...是一个重要点
    52        mat[a[i]][b[i]]=1;  //将拿掉的那个点复原
    53     }
    54     printf("Board %d have %d important blanks for %d chessmen.
    ",cont++,res,ans);
    55   }
    56 return 0;
    57 }
  • 相关阅读:
    Fedora13下真正能用的源(2015-5-16亲测)
    Shellcoding教程:介绍ASM(译)
    Shellcoding教程:介绍ASM
    ubuntu解决pppoeconf和network-manager冲突时,可能问题的解决方法
    vue_router-link传参
    js_window.postMessage往不同窗口里面发送数据
    iframe_iframe引入其它页面
    css_去掉默认样式
    vue_常用组件install
    js_正则表达式
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3928694.html
Copyright © 2011-2022 走看看