zoukankan      html  css  js  c++  java
  • Knights

    一开始写了个爆搜,WA30

    原来是用二分图最大匹配来做,表示还不是很理解啊!

    建图的时候又出了问题,原来要考虑奇偶性。。。

     1 #include<iostream>
     2 #include<fstream>
     3 #include<cstring>
     4 #define fin cin
     5 using namespace std;
     6 //ifstream fin("cin.in");
     7 
     8 int n,m;
     9 int color[30][30]={0},num[30][30]={0},f[900]={0},totx=0,toty=0; 
    10 bool map[30][30]={0},lin[900][900]={0},vis[900]={0};
    11 int tool[8][2]={{-1,-2},{-2,-1},{-2,+1},{-1,+2},
    12                 {+1,+2},{+2,+1},{+2,-1},{+1,-2}};
    13                 
    14 int Find(int k){
    15     for(int i=1;i<=toty;++i)
    16     if(!vis[i]&&lin[k][i])
    17     {
    18       vis[i]=1;
    19       if(f[i]==0||Find(f[i]))
    20       {f[i]=k;return 1;}
    21                }
    22     return 0;
    23     
    24     }
    25 
    26 
    27 int main()
    28 {
    29     fin>>n>>m;
    30     
    31     for(int i=1;i<=m;++i)
    32     {
    33       string s;
    34       fin>>s;
    35       int y=s[1]-'0',x=s[0]-'A'+1;
    36       if(s[2]<='9'&&s[2]>='0') y=y*10+s[2]-'0';
    37       map[y][x]=1;
    38             }
    39     
    40     for(int i=1;i<=n;++i)
    41     for(int j=1;j<=n;++j)
    42     if(map[i][j])
    43     {
    44       if(color[i][j]==0)
    45       {
    46         if((i%2==0&&j%2==0)||(i%2==1&&j%2==1)) color[i][j]=1;
    47         else color[i][j]=2;                
    48                         } 
    49       
    50       for(int k=0;k<=7;++k)
    51       if(tool[k][0]+j>=0&&tool[k][1]+i>=0&&map[tool[k][1]+i][tool[k][0]+j])
    52       if(!color[tool[k][1]+i][tool[k][0]+j])
    53       color[tool[k][1]+i][tool[k][0]+j]=3-color[i][j];
    54                  }
    55     
    56     for(int i=1;i<=n;++i)
    57     for(int j=1;j<=n;++j)
    58     if(map[i][j])
    59     {
    60       if(color[i][j]==1) {totx++;num[i][j]=totx;}
    61       else {toty++;num[i][j]=toty;}
    62                  }
    63     
    64     for(int i=1;i<=n;++i)
    65     for(int j=1;j<=n;++j)
    66     if(color[i][j]==1)
    67     for(int k=0;k<=7;++k)
    68     if(j+tool[k][0]>=0&&i+tool[k][1]>=0&&color[i+tool[k][1]][j+tool[k][0]]==2)
    69     lin[num[i][j]][num[i+tool[k][1]][j+tool[k][0]]]=1;
    70     
    71     int ans=0;
    72     for(int i=1;i<=totx;++i)
    73     {
    74       memset(vis,0,sizeof(vis));    
    75       if(Find(i)) ans++;       
    76             }
    77     
    78     cout<<ans<<endl;//system("pause");
    79     return 0;
    80     
    81     }
  • 相关阅读:
    【网络】IP子网划分详解
    【java】package
    【java】异常
    【java】内部类
    【java】多态
    【java】抽象类和接口区别
    【java】接口
    Java并发编程之volatile关键字解析
    String ,StringBuffer, StringBuilder的区别
    Synchronized关键字、Lock,并解释它们之间的区别
  • 原文地址:https://www.cnblogs.com/noip/p/2741964.html
Copyright © 2011-2022 走看看