• 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     }
  • 相关阅读:
    JAVA中线程池启动定时任务
    JAVA线程池的创建
    JAVA多线程售票问题
    设计模式之一 ---单例模式
    JAVAWeb使用POI做导出Excel
    ThreadLocal实现线程范围内共享
    线程的互斥与同步通信
    Spring-task-timer定时器
    万年历---java版
    linux sed 批量替换字符串
  • 原文地址:https://www.cnblogs.com/noip/p/2741964.html
Copyright © 2020-2023  润新知