您的位置:首页 > 其它

HDU 1045 Fire Net

2015-08-10 10:20 405 查看
题目链接

题目意思:输入n,接下来为n行n列,X表示墙不能放置碉堡而且碉堡打不透,同行同列不能放两个碉堡(有x阻挡的除外)

问:最多可以建立多少个碉堡。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

char str[20][20];
struct node
{
int x,y;
} a[20][20];

int maps[20][20];
int used[20];
int vis[20],x,y;

int finds(int u)
{
for(int i=1; i<=y; i++)
{
if(!vis[i]&&maps[u][i])
{
vis[i]=1;
if(!used[i]||finds(used[i]))
{
used[i]=u;
return 1;
}
}
}
return 0;
}

int main()
{
int n;
while(scanf("%d",&n),n)
{
for(int i=1; i<=n; i++)
{
scanf("%s",str[i]+1);
}
x=y=0;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(str[i][j]=='.')//对一排相邻的进行合并
{
if(j==1||str[i][j-1]=='X')
{
x++;
}
a[i][j].x=x;
}
if(str[j][i]=='.')//对一列相邻的进行合并
{
if(j==1||str[j-1][i]=='X')
{
y++;
}
a[j][i].y=y;
}
}
}
memset(maps,0,sizeof(maps));
for(int i=1; i<=n; i++)//建图。
{
for(int j=1; j<=n; j++)
{
if(str[i][j]=='.')
{
int xx=a[i][j].x;
int yy=a[i][j].y;
maps[xx][yy]=1;
}
}
}
memset(used,0,sizeof(used));
int ans=0;
for(int i=1; i<=x; i++)
{
memset(vis,0,sizeof(vis));
if(finds(i))
{
ans++;
}
}
printf("%d\n",ans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: