马虎了一下,少些了个=号,错了N 遍 http://poj.org/problem?id=3020 #include<stdio.h> #include<string.h> #define N 1000 int a,h,w; char str[N][N]; int map[N][N],vis[N],result[N]; int bian(int x,int y) { if(x>=0&&x<=h&&y>=0&&y<=w) { if(str[x][y]=='*') { return x*w+y; } return -1; } return -1; } void link(int x,int y) { a=bian(x,y); if(bian(x-1,y)!=-1) { int b=bian(x-1,y); map[a][b]=1; } if(bian(x,y+1)!=-1) { int b=bian(x,y+1); map[a][b]=1; } if(bian(x+1,y)!=-1) { int b=bian(x+1,y); map[a][b]=1; } if(bian(x,y-1)!=-1) { int b=bian(x,y-1); map[a][b]=1; } } int dfs(int x) { int i; for(i=0;i<=a;i++) { if(!vis[i]&&map[x][i]==1) { vis[i]=1; if(result[i]==0||dfs(result[i])) { result[i]=x; return 1; } } } return 0; } int main() { int l,i,j,sum; scanf("%d",&l); while(l--) { scanf("%d%d",&h,&w); memset(result,0,sizeof(result)); memset(map,0,sizeof(map)); sum=0; getchar(); for(i=0;i<h;i++) { scanf("%s",str[i]); } for(i=0;i<h;i++) { for(j=0;j<w;j++) { if(str[i][j]=='*') { link(i,j); sum++; } } } int ans=0; for(i=0;i<=a;i++) { memset(vis,0,sizeof(vis)); if(dfs(i))ans++; } printf("%d\n",sum-ans/2); } }