博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1045 Fire Net
阅读量:5128 次
发布时间:2019-06-13

本文共 1919 字,大约阅读时间需要 6 分钟。

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

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

#include 
#include
#include
#include
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;}

 

转载于:https://www.cnblogs.com/mengzhong/p/4717235.html

你可能感兴趣的文章
C#读取word模版并对指定域写入数据保存为新word
查看>>
java通过dom读写xml文件
查看>>
HDU 1010 Tempter of the Bone DFS 简单题 注意剪枝
查看>>
利用python将txt文件转换为csv
查看>>
后缀转中缀的另一种方法——二叉树的遍历
查看>>
[SQLite]SQL语法
查看>>
SSM+shiro及相关插件的整合maven所有依赖,详细注释版,自用,持续更新
查看>>
ef实现左关联查询
查看>>
关于团队建设和个人成长
查看>>
AcWing 286. 选课 (树形依赖分组背包)打卡
查看>>
9.17 基于ajax上传文件
查看>>
axis2调用.net写的webservice接口实现,指定参数名
查看>>
[php]禁用缓存
查看>>
[java] 获取pdf/word文档文本内容
查看>>
关于TOMCAT的 ROOT/WEB-INF/web.xml的配置
查看>>
python内置函数、匿名函数、递归
查看>>
Eclipse与maven的环境搭建
查看>>
mysql where执行顺序
查看>>
Java遇见HTML——JSP篇之JSP指令与动作元素
查看>>
Activiti 启动事件(Start Event)
查看>>