题目链接

题目大意:

假设我们有一个正方形的城市,并且街道是直的。城市的地图是n行n列,每一个单元代表一个街道或者一块墙。

碉堡是一个小城堡,有四个开放的射击口。四个方向是面向北、东、南和西。在每一个口子上有一架机关枪。

假设子弹能够穿过任何距离,并且摧毁路上的碉堡。另一方面,子弹不能穿越墙。

我们的目标是在城市里设置足够多的碉堡,并且任何两个碉堡都不会互相摧毁。正确的配置是没有两个碉堡在相同的水平行或者垂直列上,除非碉堡之间有墙把它们分开。在这个问题中,我们将使用小的方形城市(最多4*4),它包含了墙,并且子弹不能穿越。

接下来的图片显示五张城市地图,第1张图片是空的布局,第2张和第3张图片显示了合法的配置,第4和第5张图片显示了非法的配置。对于这样的地形来说,碉堡的最大数是5;第2张图片显示了这个配置方案,但还有其他的配置方案。

你的任务是写一个程序,在给出的地图描述下,计算城市中可以合法放置的碉堡的最大数。

输入文件包含一个或者多个地图描述,0作为文件的结束。每个地图描述首行是城市的尺寸n,n最大为4。接下来的n行描述了地图的每一行,符号“."代表开放区域,大写的X代表墙。输入文件中没有空格。

每一个测试用例,最后输出一行为合法放置碉堡的最大数。

Sample input:

4
.X..
....
XX..
....
2
XX
.X
3
.X.
X.X
.X.
3
...
.XX
.XX
4
....
....
....
....
0

Sample output:

5
1
5
2
4
#include <bits/stdc++.h>
using namespace std;int n,ans;
char mpa[5][5];
bool vis[5][5];bool check(int x,int y){    //四个方向判断是否与之前防止的碉堡冲突for(int i=x+1;i<=n;i++){ if(mpa[i][y]=='O')return false; if(mpa[i][y]=='X')break; }for(int i=x-1;i>=1;i--){ if(mpa[i][y]=='O')return false; if(mpa[i][y]=='X')break; }for(int j=y+1;j<=n;j++){ if(mpa[x][j]=='O')return false; if(mpa[x][j]=='X')break; }for(int j=y-1;j>=1;j--){ if(mpa[x][j]=='O')return false; if(mpa[x][j]=='X')break; }return true;
}
void dfs(int x,int y,int num){    if(ans<num)ans=num;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(!vis[i][j]&&check(i,j)&&mpa[i][j]=='.'){vis[i][j]=1;mpa[i][j]='O';dfs(i,j,num+1);     //选择放与不放vis[i][j]=0;mpa[i][j]='.';}}}
}
int main(){while(~scanf("%d",&n),n){getchar();for(int i=1;i<=n;i++){scanf("%s",mpa[i]+1);}memset(vis,false,sizeof(vis));ans=0;dfs(1,1,0);printf("%d\n",ans);}
}

 

转载于:https://www.cnblogs.com/00isok/p/8681213.html

zoj 1002 Fire Net 碉堡的最大数量【DFS】相关推荐

  1. zoj 1002 Fire Net(DFS~ 哈哈哈哈,终于过了!!!)

    1002 从一开始做ACM就郁闷的一道题,在1001下面它应该觉得压力很大啊!!哈哈.. 做完八皇后,党说这个能做了... 嘿嘿.这题是找放置最多数目的blockhouses(碉堡..)使之不能同行同 ...

  2. 算法题目——省份数量(dfs,bfs)

    题目链接:leetcode.547省份数量 dfs: 深度优先遍历:递归 思路:读入数据完成后 重点:建立一个数组记录该省份是否访问,新建一个元素记录省份圈的个数 1.对所有省份循环一次,如果该省份未 ...

  3. [Leedcode][JAVA][第200题][岛屿数量][DFS][BFS][并查集]

    [问题描述] 第200题 岛屿数量 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量.岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成 ...

  4. Java岛屿数量(DFS)

    200.岛屿数量 解题思路: 来自K神 class Solution {public int numIslands(char[][] grid) {int count = 0;for(int i = ...

  5. *【ZOJ - 3781】Paint the Grid Reloaded(dfs求连通块缩点,bfs求最短路,建图技巧)

    题干: Leo has a grid with N rows and M columns. All cells are painted with either black or white initi ...

  6. 碉堡了的kotlin扩展函数

    //下面的方法存在于一个方法体中 // var isContainQSSQ2 = "ddddd2".isContainerQSSQ()//there not isContainer ...

  7. POJ ZOJ题目分类

    POJ,ZOJ题目分类(多篇整合版,分类很细致,全面) 标签: 题目分类POJ整理 2015-04-18 14:44 1672人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: ACM资料(5) ...

  8. POJ,ZOJ题目分类(多篇整合版,分类很细致,全面)

    水题: 3299,2159,2739,1083,2262,1503,3006,2255,3094 初级: 一.基本算法:        (1)枚举 (1753,2965)       (2)贪心(13 ...

  9. ZOJ 题目分类,学校的一个巨巨做的。

     DP: 1011      NTA                    简单题 1013      Great Equipment        简单题 1024      Calendar ...

最新文章

  1. 13个月才跑通GitHub模型,机器学习科研入门太难了吧
  2. 论网络营销在我国的发展
  3. 线上性能问题初步排查方法
  4. java基础学习,一些零散的笔记之内部类
  5. python bootstrap-fileinput示例_bootstrap fileinput完整实例分享
  6. java nio 读取图片_给大忙人们看的 Java NIO 极简教程
  7. 【Linux】一步一步学Linux——groupmod命令(89)
  8. Spark源码分析之Worker
  9. Centos7搭建Redis,同一服务器启动两个端口的Redis
  10. 南京理工大学计算机学院教授严捍,2019年7月1日学术报告二则(宋巍 教授,南京理工大学;张鹏程 副教授,河海大学)...
  11. 数据平面开发套件(DPDK)中的Vhost / Virtio的配置和性能
  12. 使用Event Bus模式解耦Android App组件间通信
  13. 谷歌浏览器chrome假死、卡死、经常无反应,火狐firefox闪黑格子的解决办法(显卡/驱动兼容问题)...
  14. Linux组件封装(一)中互斥锁MutexLock的封装
  15. 产品的思路——来自腾讯张小龙的分享(全版)
  16. Mysql压缩包版的安装教程
  17. c51单片机矩阵键盘1602计算器_基于AT89C51单片机的十进制计算器系统设计
  18. Flink(五):watermark简介
  19. Spring Security详细讲解(JWT+SpringSecurity登入案例)
  20. 使用qemu运行银河麒麟操作系统

热门文章

  1. ue4云渲染WebSocket通信过程
  2. [OpenWrt] reset按键处理流程(hotplug)
  3. Easy3D 孔洞识别
  4. VMware安装Ubuntu开启蓝屏解决方案
  5. 能否通过六面照片构建3D模型?比如人脸,全身的多角度照片,生成3D模型。?...
  6. Android获取微信聊天记录的过程详解
  7. 十级龙王间的决斗(C++)
  8. axure画扇形_如何利用axure制作一个动态的饼状图
  9. 英语——不定词(二)
  10. Yahoo,Msn,Skype,QQ,阿里旺旺在线聊天链接接口调用