在线编程在线课堂在线测评Anycodes在线编程

编程论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

How to use bs4??
本帖最后由 carry0987 于
Double Queue 问题描述 : The new founded Balkan Investment Group Bank (
John 问题描述 : Little John is playing very funny game
linux-command Linux命令大全搜索工具,内容包含Linux命令
Coati 是一款跨平台的代码查看工具,适用于 C/C++ 和 Java。商业软件。特性:1. 索引
系统可承载海量并发,消息收发确认机制 保障消息必达 系统采用动态智
全平台视频监控,支持安卓苹果以及pcweb,支持海康大华等主流dvr,全部源码以及文档 单聊、群聊、商
如何访问类的私有属性? 下面以 TPathData 为例,
问题:从 XE4 以来,Firemonkey 曲线绘图在移动平台不平滑的问题一直令人诟病,提交到官方的 QC 也是族繁不及备载,官方似乎有意的
操作数据库(RODBC)   odbcConnect(dsn, uid="", p
数据模式:mode函数显示任何对象的模式。常见的单个的
系统可承载海量并发,消息收发确认机制 保障消息必达 系统采用动态智
RabbitMQ与PHP(一) 项
Iease团队扩编预备中,盼望能有Ruby或者java工程师加盟。全职兼职都可以。有爱好的伴侣请与我接洽。 邮件:i
ruby 怎么设置装备摆设GTK2,求教指导下!
#include #include #include #include using namespace std; int main() {
标题如图所示: 有n盏灯,编号1~n。一开端灯都是关着的
成熟的消息收发确认机制,支持万人大群 支持开发自定义的消息sdk接口,扩展性超强 支持单/
成熟的消息收发确认机制,支持万人大群 支持开发自定义的消息sdk接口,扩展性超强 支持单/
1. 注意列表和集合的区别 set 列表表现形式: list_1
Ajax   Ajax即“Asynchronous Javascript And
大师好,我比来在做布谷鸟优
分辨提取A和B图像Harris角点,接下来须要对

[HDU杭电] HDU 1045 Fire Net-DFS-[解题报告] Cpp

[复制链接]
发表于 2016-3-25 22:13:46 | 显示全部楼层 |阅读模式
Fire Net


问题描述 :
Suppose that we have a square city with straight streets. A map of a city is a square board with n rows and n columns, each representing a street or a piece of wall. A blockhouse is a small castle that has four openings through which to shoot. The four openings are facing North, East, South, and West, respectively. There will be one machine gun shooting through each opening. Here we assume that a bullet is so powerful that it can run across any distance and destroy a blockhouse on its way. On the other hand, a wall is so strongly built that can stop the bullets. The goal is to place as many blockhouses in a city as possible so that no two can destroy each other. A configuration of blockhouses is legal provided that no two blockhouses are on the same horizontal row or vertical column in a map unless there is at least one wall separating them. In this problem we will consider small square cities (at most 4×4) that contain walls through which bullets cannot run through. The following image shows five pictures of the same board. The first picture is the empty board, the second and third pictures show legal configurations, and the fourth and fifth pictures show illegal configurations. For this board, the maximum number of blockhouses in a legal configuration is 5; the second picture shows one way to do it, but there are several other ways.

HDU 1045 Fire Net-DFS-[解题报告] Cpp

HDU 1045 Fire Net-DFS-[解题报告] Cpp
Your task is to write a program that, given a description of a map, calculates the maximum number of blockhouses that can be placed in the city in a legal configuration.  
输入:
The input file contains one or more map descriptions, followed by a line containing the number 0 that signals the end of the file. Each map description begins with a line containing a positive integer n that is the size of the city; n will be at most 4. The next n lines each describe one row of the map, with a ‘.’ indicating an open space and an uppercase ‘X’ indicating a wall. There are no spaces in the input file.  
输出:
For each test case, output one line containing the maximum number of blockhouses that can be placed in the city in a legal configuration.
样例输入:

  1. 4
  2. .X..
  3. ....
  4. XX..
  5. ....
  6. 2
  7. XX
  8. .X
  9. 3
  10. .X.
  11. X.X
  12. .X.
  13. 3
  14. ...
  15. .XX
  16. .XX
  17. 4
  18. ....
  19. ....
  20. ....
  21. ....
  22. 0
复制代码
样例输出:

  1. 5
  2. 1
  3. 5
  4. 2
  5. 4
复制代码
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045
题目描述:给你一个n x n的矩阵,若该点不为障碍,则可以放置大炮,大炮可向上下左右4个方向开炮,所以若同一行或同一列存在2门大炮并且他们之间没有障碍,则会出现互相攻击,当然我们不希望这种情况出现。现在问你最多能放置多少门大炮并且他们不能互相攻击。
解题思路:对于每个点,若能放置大炮则能选择放或者不放两种情况,若不能放置大炮则就只有一种情况。由于题目的数据规模很小,n<=4. 所以可以使用暴力搜索。注意回溯的时候要恢复点的状态.
  1. #include <iostream>
  2. using namespace std;

  3. char map[10][10];
  4. int n;
  5. int ans;

  6. int judge(int k) //判断该点能否放置大炮
  7. {
  8.         int x = k / n;
  9.         int y = k % n;
  10.         int i;
  11.         for(i=y; i>=0; i--)                //从该点往左找
  12.         {
  13.                 if(map[x][i] == 'X')
  14.                 {
  15.                         break;
  16.                 }
  17.                 if(map[x][i] == '@')
  18.                 {
  19.                         return false;
  20.                 }
  21.         }
  22.         for(i=x; i>=0; i--)   //从该点往上找
  23.         {
  24.                 if(map[i][y] == 'X')
  25.                 {
  26.                         break;
  27.                 }
  28.                 if(map[i][y] == '@')
  29.                 {
  30.                         return false;
  31.                 }
  32.         }
  33.         return true;
  34. }

  35. void dfs(int k, int cnt)
  36. {
  37.         if(k == n * n)
  38.         {
  39.                 if(cnt > ans)
  40.                 {
  41.                         ans = cnt;
  42.                 }
  43.                 return ;
  44.         }
  45.         if(map[k/n][k%n] == '.' && judge(k))  //若该点能放置大炮
  46.         {
  47.                 map[k/n][k%n] = '@';      //'@' 标记为大炮
  48.                 dfs(k+1,cnt+1);
  49.                 map[k/n][k%n] = '.';        //回溯时恢复该点状态
  50.         }
  51.         dfs(k+1,cnt);  //不放
  52. }

  53. int main()
  54. {
  55.         while(cin>>n,n)
  56.         {
  57.                 ans = 0;
  58.                 for(int i=0; i<n; i++)
  59.                 {
  60.                         cin>>map[i];
  61.                 }
  62.                 dfs(0,0);
  63.                 cout<<ans<<endl;
  64.         }
  65.         return 0;
  66. }
复制代码
在线编程(http://www.anycodes.cn)&编程论坛(http://www.52exe.cn)感谢您的支持!
回复

使用道具 举报

发布主题 上个主题 下个主题 快速回复 返回列表 官方QQ群
在线客服
客 服 中 心
群 机 器 人
网站二维码
收 起 客 服

QQ|Archiver|手机版|小黑屋|Anycodes ( ICP14002806Anycodes在线编程

GMT+8, 2018-11-15 04:48 , Processed in 1.894934 second(s), 71 queries .

Powered by Anycodes

© 2001-2013 吉林市群龙科技有限公司 Inc.

快速回复 返回顶部 返回列表