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     }
posted on 2012-10-26 23:34  怡红公子  阅读(302)  评论(0编辑  收藏  举报