#include<stdio.h>
#include<string.h>
int n;
int maxx;
char map[][];
int dx[]={,-,,};
int dy[]={,,,-}; int block[][][];//炮台位置 bool ok(int x,int y){
int i,x1,y1;
if(map[x][y]!='.')
return false;
for(i=;i<;i++){
x1=x+dx[i];
y1=y+dy[i];
while(){
if(x1<||x1>=n||y1<||y1>=n||map[x1][y1]=='X')//遇到边界跳出来
break;
else if(map[x1][y1]=='')//遇到'X'跳出来
return false;
x1+=dx[i];
y1+=dy[i];//没有的话就沿着行和列一直找
}
}
return true;
} void dfs(int k){
int i,j;
for(i=;i<n;i++){
for(j=;j<n;j++){
if(ok(i,j)){//判断是否能放置
map[i][j]='';//如果能将其所在行和列标记为'1',不能放置直到碰到'X'
dfs(k+);//成功放置的话就加1
map[i][j]='.';//回溯
}
}
if(maxx<k){//寻找最大数量
maxx=k;
}
}
} int main(){
int i,j;
while(scanf("%d",&n)!=EOF&&n){
maxx=;
for(i=;i<n;i++){
scanf("%s",map[i]);
}
dfs();
printf("%d\n",maxx);
}
return ;
}

二分图方法:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n1,n2;
char map[][]; //数组开大点
int mapx[][],mapy[][];
int ma[][];//邻接矩阵true代表有边相连
int result[],visit[];
int x,y; int find(int a){
int i;
for(i=;i<=y;i++){
if(!visit[i]&&ma[a][i]){//如果节点i与a相邻并且未被查找过
visit[i]=;//标记i为已查找过
if(!result[i]||find(result[i])){//如果i未在前一个匹配M中或者i在匹配M中,但是从与i相邻的节点出发可以有增广路
result[i]=a;//记录查找成功记录
return ;
}
}
}
return ;
} int main(){
int i,j,ans;
while(scanf("%d",&n1)!=EOF&&n1){
n2=n1;
for(i=;i<n1;i++){
scanf("%s",map[i]);
}
memset(mapx,,sizeof(mapx));
memset(mapy,,sizeof(mapy));
x=;
for(i=;i<n1;i++){
for(j=;j<n2;j++){
if(map[i][j]=='.'){
++x;
while(j<n2&&map[i][j]=='.'){
mapx[i][j]=x;
j++;
}
}
}
}
y=;
for(j=;j<n2;j++){
for(i=;i<n1;i++){
if(map[i][j]=='.'){
++y;
while(i<n1&&map[i][j]=='.'){
mapy[i][j]=y;
i++;
}
}
}
} for(i=;i<n1;i++){
for(j=;j<n2;j++){
ma[mapx[i][j]][mapy[i][j]]=;
}
} ans=; memset(result,,sizeof(result));
for(i=;i<=x;i++){
memset(visit,,sizeof(visit));//清空上次搜索时的标记
ans+=find(i); //从节点i尝试扩展
}
printf("%d\n",ans);
}
return ;
}

hdu1045 DFS的更多相关文章

  1. HDU1045 Fire Net(DFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others)  ...

  2. HDU1045 Fire Net(DFS枚举||二分图匹配) 2016-07-24 13:23 99人阅读 评论(0) 收藏

    Fire Net Problem Description Suppose that we have a square city with straight streets. A map of a ci ...

  3. HDU1045:Fire Net(二分图匹配 / DFS)

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  4. 【HDU-1045,Fire Net-纯暴力简单DFS】

    原题链接:点击!   大致题意:白块表示可以放置炮台的位置——每个炮台可以攻击到上下左右的直线上的炮台(也就是说在它的上下左右直线上不可以再放置炮台,避免引起互相攻击),黑块表示隔离墙的位置——不可放 ...

  5. hdu1045 炮台的配置 dfs

    只要炮台在同一行或者同一列,就可以互相摧毁,遇到墙则无法对墙后的炮台造成伤害,可以通过dfs搜索n*n的方格,全部搜完算一轮,计算炮台数,并保存其最大值. 其中对于t编号的炮台,位置可以计算出是(t/ ...

  6. BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 1280 MBSubmit: 3127  Solved: 795[Submit][Status][Discu ...

  7. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

  8. BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1352  Solved: 780[Submit][Stat ...

  9. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

随机推荐

  1. java日志学习笔记

    一.日志家族 Log4j一开始就很强大,在jdk自带日志系统之前,apache就曾经尝试把log4j划为java的一部分,不知为何没能成功,sun还是用了自己很弱的日志系统.为了兼容各个日志系统,ap ...

  2. Django form

    简单的from验证 文件目录结构 urls.py from app1.views import account urlpatterns = [ url(r'^admin/', admin.site.u ...

  3. PRINCE2风险模块

    我们前几个节学习了PRINCE2七大主题的商业论证.组织.质量和计划,今天我们开展对于风险模块的讲解. 风险:目的是识别.评估和控制不确定性,从而提高项目的成功率.PRINCE2对风险登记册进行了详细 ...

  4. C# 通过Selecnuim WebDriver操作非IE浏览器

    之前有需求需要操作Chrome中的dom元素,没做过这个,但是网上关于这个方面的资料比较少,所以自己捣腾了几天,在知道.net中有这个玩意. 但是一百度,全是关于java,python的而c#的那是一 ...

  5. bzoj 1070 [SCOI2007]修车

    最小费用最大流. 将每个技术人员拆成车数个点,技术人员i的第j个点代表技术人员i修的倒数第j辆车. 源点向所有技术人员点连一条容量为1费用为0的边. 所有技术人员点向所有车点连边:技术人员i的第j个点 ...

  6. Block 代码快

    1.原理 1.1block类型 a.全局bock块   贯彻整个程序 b.栈块  存在于栈内存中,作用域中使用 c.堆块  自行管理其内存 注*:http://blog.parse.com/learn ...

  7. Java时间类型转换

    String转Long Long long=new SimpleDateFormat("yyyyMMddHHmmss").parse(String).getTime(); Long ...

  8. Day7-面向对象

    面向对象编程定义 OOP编程是利用"类"和"对象"来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得更简单,并 ...

  9. android studio关联genymotion模拟器,未显示设备

    如以下截图所示,在搭建android studio+genymotion时,遇到android studio关联genymotion时,显示不出模拟器设备,请问有没有遇到此现象的朋友,分享下解决方法, ...

  10. HTML学习

    <!DOCTYPE html> <html> <head> <title>标题</title> <meta charset=" ...