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): 2434    Accepted Submission(s): 1417


    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.
    这题巧妙的把每个点拆成,x与y,每个点就是x与y相连的一条边
    判断某个点是否能删,就可以转化成,x与y相连与不想连
     1 #include<string>
     2 #include<cstdio>
     3 #include<iostream>
     4 #include<vector>
     5 #include<queue>
     6 #include<stack>
     7 #include<algorithm>
     8 #include<cstring>
     9 #include<stdlib.h>
    10 #include<string>
    11 #include<cmath>
    12 using namespace std;
    13 #define pb push_back
    14 int k,n,m;
    15 int cx[510],cy[510],vit[510],a[510],b[510];
    16 vector<int >ko[510];
    17 int Find(int pos){
    18     for(int i=0;i<ko[pos].size();i++){
    19         int to=ko[pos][i];
    20         if(!vit[to]){
    21             vit[to]=1;
    22             if(cx[to]==-1||Find(cx[to])){
    23                cx[to]=pos;
    24                cy[pos]=to;
    25                 return 1;
    26             }
    27         }
    28     }
    29     return 0;
    30 }
    31 int solve(){
    32     int cnt=0;
    33      memset(cx,-1,sizeof(cx));
    34     memset(cy,-1,sizeof(cy));
    35     for(int i=1;i<=n;i++){
    36         memset(vit,0,sizeof(vit));
    37         if(Find(i)) cnt++;
    38     }
    39     return cnt;
    40 }
    41 int main(){
    42     int cas=0;
    43     while(cin>>n>>m>>k){
    44         for(int i=1;i<=n;i++)
    45             ko[i].clear();
    46         for(int i=1;i<=k;i++){
    47             scanf("%d%d",&a[i],&b[i]);
    48             ko[a[i]].pb(b[i]);
    49         }
    50         int mm=solve(),sum=0;
    51         for(int i=1;i<=k;i++){
    52             int tmp=a[i];
    53             std::vector<int >::iterator it;
    54             for(it=ko[tmp].begin();it!=ko[tmp].end();){
    55                 if(*it==b[i]){
    56                     it=ko[tmp].erase(it);
    57                 }
    58                 else it++;
    59             }
    60             int ttmp=solve();
    61             if(ttmp<mm) sum++;
    62             ko[tmp].pb(b[i]);
    63         }
    64         printf("Board %d have %d important blanks for %d chessmen.
    ",++cas,sum,mm);
    65     }
    66 }
  • 相关阅读:
    zw版【转发·台湾nvp系列Delphi例程】HALCON MoveRectangle
    zw版【转发·台湾nvp系列Delphi例程】HALCON SetIcon1
    zw版【转发·台湾nvp系列Delphi例程】HALCON SetIcon2
    zw版【转发·台湾nvp系列Delphi例程】HALCON DispArc
    zw版【转发·台湾nvp系列Delphi例程】HALCON HSerializedItem
    zw版【转发·台湾nvp系列Delphi例程】HALCON union1
    zw版【转发·台湾nvp系列Delphi例程】HALCON SqrtImage
    zw版【转发·台湾nvp系列Delphi例程】HALCON SubImage
    zw版【转发·台湾nvp系列Delphi例程】HALCON SetWindowExtent
    Raphael绘制圆圈环绕方法
  • 原文地址:https://www.cnblogs.com/ainixu1314/p/3901798.html
Copyright © 2011-2022 走看看