参考了别人的代码。给力啊。 匈牙利算法。。 #include <iostream> using namespace std; bool map[110][110]; bool used[110][110]; int match[110][110]; int dir[4][2]={-1,0,1,0,0,-1,0,1};//方向,学习了。 bool find(int fx,int fy) { int x,y,i; for(i=0;i<4;++i) { x=fx+dir[i][0]; y=fy+dir[i][1]; if(map[x][y]&&!used[x][y]) { used[x][y]=true; if(match[x][y]==-1||find(x-dir[match[x][y]][0],y-dir[match[x][y]][1])) { match[x][y]=i;//很巧妙的一个地方,记下匹配的方向而不是点的坐标,省空间,耗时间,=。= return true; } } } return false; } int hungary(int n,int m) { int i,j,sum(0); memset(match,-1,sizeof(match)); for(i=1;i<=n;++i) { for(j=1;j<=m;++j) { if(map[i][j]) { memset(used,0,sizeof(used)); if(find(i,j)) sum++; } } } return sum; } int main() { int n,m,t,i,j; while(scanf("%d",&t)!=EOF) { while(t--) { memset(map,0,sizeof(map)); scanf("%d%d",&n,&m); for(i=1;i<=n;++i) { for(j=1;j<=m;++j) scanf(" %d",&map[i][j]); } printf("%d/n",hungary(n,m)); } } return 0; }