原帖地址http://www.cnblogs.com/kuangbin/archive/2011/08/09/2132830.html
/*
HDU 1045
*/
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int uN,vN;
int g[20][20];
int linker[20];
bool used[20];
char map[5][5];
int mapr[5][5];
int mapl[5][5];
bool dfs(int u)
{
int v;
for(v=1;v<=vN;v++)
if(g[u][v]&&!used[v])
{
used[v]=true;
if(linker[v]==-1||dfs(linker[v]))
{
linker[v]=u;
return true;
}
}
return false;
}
int hungary()
{
int res=0;
int u;
memset(linker,-1,sizeof(linker));
for(u=1;u<=uN;u++)
{
memset(used,0,sizeof(used));
if(dfs(u)) res++;
}
return res;
}
int main()
{
int i,j,n;
while(scanf("%d",&n),n)
{
memset(mapl,0,sizeof(mapl));
memset(mapr,0,sizeof(mapr));
memset(g,0,sizeof(g));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cin>>map[i][j];
if(map[i][j]=='X')
mapl[i][j]=mapr[i][j]=-1;
}
int p1=0;
uN=0;vN=0;
//给行编号
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
while(mapr[i][j]==-1&&j<=n)
j++;
p1++;
while(mapr[i][j]!=-1&&j<=n)
{
mapr[i][j]=p1;
if(uN<p1) uN=p1;
j++;
}
}
int p2=0;
//给列编号
for(j=1;j<=n;j++)
for(i=1;i<=n;i++)
{
while(mapl[i][j]==-1&&i<=n)
i++;
p2++;
while(mapl[i][j]!=-1&&i<=n)
{
mapl[i][j]=p2;
if(vN<p2) vN=p2;
i++;
}
}
//建图
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(mapr[i][j]!=-1&&mapl[i][j]!=-1)
g[mapr[i][j]][mapl[i][j]]=1;
}
printf("%d\n",hungary());
}
return 0;
}
暴搜
/*
HDU 1045(暴搜方法)
*/
#include<stdio.h>
using namespace std;
char map[5][5];
int maxnum;
int n;
bool Build(int row,int col)
{
int i,j;
for(i=row;i>=0;i--)
{
if(map[i][col]=='O') return false;
if(map[i][col]=='X') break;
}
for(j=col;j>=0;j--)
{
if(map[row][j]=='O') return false;
if(map[row][j]=='X') break;
}
return true;
}
void dfs(int i,int num)
{
int row,col;
if(i==n*n)
{
if(num>maxnum) maxnum=num;
return ;
}
else
{
row=i/n;
col=i%n;
if(map[row][col]=='.'&&Build(row,col))
{
map[row][col]='O';
dfs(i+1,num+1);
map[row][col]='.';
}
dfs(i+1,num);
}
}
int main()
{
int i;
while(scanf("%d",&n),n)
{
maxnum=0;
for(i=0;i<n;i++)
scanf("%s",&map[i]);
dfs(0,0);
printf("%d\n",maxnum);
}
return 0;
}