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 }