1. #include<stdio.h>
  2. #include<string.h>
  3. int n;
  4. int maxx;
  5. char map[][];
  6. int dx[]={,-,,};
  7. int dy[]={,,,-};
  8.  
  9. int block[][][];//炮台位置
  10.  
  11. bool ok(int x,int y){
  12. int i,x1,y1;
  13. if(map[x][y]!='.')
  14. return false;
  15. for(i=;i<;i++){
  16. x1=x+dx[i];
  17. y1=y+dy[i];
  18. while(){
  19. if(x1<||x1>=n||y1<||y1>=n||map[x1][y1]=='X')//遇到边界跳出来
  20. break;
  21. else if(map[x1][y1]=='')//遇到'X'跳出来
  22. return false;
  23. x1+=dx[i];
  24. y1+=dy[i];//没有的话就沿着行和列一直找
  25. }
  26. }
  27. return true;
  28. }
  29.  
  30. void dfs(int k){
  31. int i,j;
  32. for(i=;i<n;i++){
  33. for(j=;j<n;j++){
  34. if(ok(i,j)){//判断是否能放置
  35. map[i][j]='';//如果能将其所在行和列标记为'1',不能放置直到碰到'X'
  36. dfs(k+);//成功放置的话就加1
  37. map[i][j]='.';//回溯
  38. }
  39. }
  40. if(maxx<k){//寻找最大数量
  41. maxx=k;
  42. }
  43. }
  44. }
  45.  
  46. int main(){
  47. int i,j;
  48. while(scanf("%d",&n)!=EOF&&n){
  49. maxx=;
  50. for(i=;i<n;i++){
  51. scanf("%s",map[i]);
  52. }
  53. dfs();
  54. printf("%d\n",maxx);
  55. }
  56. return ;
  57. }

二分图方法:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. int n1,n2;
  5. char map[][]; //数组开大点
  6. int mapx[][],mapy[][];
  7. int ma[][];//邻接矩阵true代表有边相连
  8. int result[],visit[];
  9. int x,y;
  10.  
  11. int find(int a){
  12. int i;
  13. for(i=;i<=y;i++){
  14. if(!visit[i]&&ma[a][i]){//如果节点i与a相邻并且未被查找过
  15. visit[i]=;//标记i为已查找过
  16. if(!result[i]||find(result[i])){//如果i未在前一个匹配M中或者i在匹配M中,但是从与i相邻的节点出发可以有增广路
  17. result[i]=a;//记录查找成功记录
  18. return ;
  19. }
  20. }
  21. }
  22. return ;
  23. }
  24.  
  25. int main(){
  26. int i,j,ans;
  27. while(scanf("%d",&n1)!=EOF&&n1){
  28. n2=n1;
  29. for(i=;i<n1;i++){
  30. scanf("%s",map[i]);
  31. }
  32. memset(mapx,,sizeof(mapx));
  33. memset(mapy,,sizeof(mapy));
  34. x=;
  35. for(i=;i<n1;i++){
  36. for(j=;j<n2;j++){
  37. if(map[i][j]=='.'){
  38. ++x;
  39. while(j<n2&&map[i][j]=='.'){
  40. mapx[i][j]=x;
  41. j++;
  42. }
  43. }
  44. }
  45. }
  46. y=;
  47. for(j=;j<n2;j++){
  48. for(i=;i<n1;i++){
  49. if(map[i][j]=='.'){
  50. ++y;
  51. while(i<n1&&map[i][j]=='.'){
  52. mapy[i][j]=y;
  53. i++;
  54. }
  55. }
  56. }
  57. }
  58.  
  59. for(i=;i<n1;i++){
  60. for(j=;j<n2;j++){
  61. ma[mapx[i][j]][mapy[i][j]]=;
  62. }
  63. }
  64.  
  65. ans=;
  66.  
  67. memset(result,,sizeof(result));
  68. for(i=;i<=x;i++){
  69. memset(visit,,sizeof(visit));//清空上次搜索时的标记
  70. ans+=find(i); //从节点i尝试扩展
  71. }
  72. printf("%d\n",ans);
  73. }
  74. return ;
  75. }

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. 20145213《信息安全系统设计基础》实验一 Linux开发环境的配置

    北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级:1452 姓名: 黄亚奇 祁玮 学号:20145213 20145222 成绩: 指导教师:娄嘉鹏 实验日期:2016 ...

  2. Ajax入门(一)

    最近开始学习Ajax了0.0,虽然其他的还没巩固,但既然学了就先写下来吧... Ajax的定义呢,百度吧= =...就觉得最实用的地方就是页面无刷新,但网页实现了与后台的同步更新.   1, 首先创建 ...

  3. Windows10下安装OpenSSL

    Windows10下安装的方法 安装环境:Windows10专业版+VS2013 工具:ActivePerl-5.22.1.2201-MSWin32-x64-299574.msi,下载地址:http: ...

  4. 用css3做一个正方体

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 进度条投票-W

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  6. NOIP2016滚粗记

    想了好久还是决定要写... Day0 Day-5得感冒一直没好,连磕5天药丸. 早晨得知爸妈都要上班并不能送我到校的消息,于是计划10:30集合,定表8:45准备自己走去学校. 然后平常睡得有点晚,结 ...

  7. Linux终端使用代理服务器

    1.YUM添加代理服务器: [root@localhost /]# vim /etc/yum.conf 添加如下项目: proxy=http://172.16.1.188:8888/2.WGET添加代 ...

  8. AJAX学习笔记

    AJAX不是一种编程语言,AJAX是一种实现网页异步加载的技术,即不刷新网页也能部分的更新网页的内容.如:提交表单信息,通过ajax可以不刷新页面来使得人们明白如何正确的填写信息,判断填写信息的错误或 ...

  9. springboot + mysql 编写

    1.springboot+mysql连接因为用的是hibernate框架,所以首先修改model,增加如下内容:

  10. mysql 基础操作一

    1.登录数据库 mysql -u root -p 2.查看数据库 show databases; 3.进入数据库 use  数据库名 4.查看该数据库中的表 show tables; 5.查看某一表中 ...