马虎了一下,少些了个=号,错了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);
}
}