HDU1045 Fire Net(DFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045
Fire Net
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8185 Accepted Submission(s): 4691
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 4x4) 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.
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.
/*
本题思路: 暴力DFS, 每个点都先假设放上子弹,
然后判断是否成立再DFS。不过在分别判断行和列是否合法
时, 是从小到大DFS的, 所以只判断前面的即可!
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; char pic[][];
int ans, n;
int Judge(int row, int col)
{
for(int i=col-; i>=; i--)//判断所在列
{
if(pic[row][i]=='a') return false;
if(pic[row][i]=='X') break;
}
for(int i=row-; i>=; i--)//判断所在行
{
if(pic[i][col]=='a') return false;
if(pic[i][col]=='X') break;
}
return true;
}
void dfs(int cur, int tot)
{
if(cur==n*n)
{
ans = max(ans, tot);
return;
}
else
{
int row = cur/n;//这里是一个很有意思的小技巧
int col = cur%n;
if(pic[row][col]=='.'&&Judge(row, col))
{
pic[row][col]='a';
dfs(cur+, tot+);
pic[row][col] = '.';
}
dfs(cur+, tot);
}
} int main()
{
while(scanf("%d", &n), n)
{
memset(pic, , sizeof(pic));
for(int i=; i<n; i++)
scanf("%s", pic[i]);
ans = ;
dfs(, );
printf("%d\n", ans);
}
return ;
}
然而上述代码有一个缺陷,前面的行和列坑能合理。但是可能放置子弹后(后面也有子弹且无墙),导致不合理。 然而这道题的数据奇弱,因此能过。
下述代码虽然比上面的跑的稍慢,但仍是0ms飘过。(这道题的数据规模真是亲民)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; char pic[][];
int ans, n;
int Judge(int row, int col)
{
for(int i=n-; i>=; i--)//判断所在列
{
if(pic[row][i]=='a') return false;
if(pic[row][i]=='X') break;
}
for(int i=n-; i>=; i--)//判断所在行
{
if(pic[i][col]=='a') return false;
if(pic[i][col]=='X') break;
}
return true;
}
void dfs(int cur, int tot)
{
if(cur==n*n)
{
ans = max(ans, tot);
return;
}
else
{
int row = cur/n;//这里是一个很有意思的小技巧
int col = cur%n;
if(pic[row][col]=='.'&&Judge(row, col))
{
pic[row][col]='a';
dfs(cur+, tot+);
pic[row][col] = '.';
}
dfs(cur+, tot);
}
} int main()
{
while(scanf("%d", &n), n)
{
memset(pic, , sizeof(pic));
for(int i=; i<n; i++)
scanf("%s", pic[i]);
ans = ;
dfs(, );
printf("%d\n", ans);
}
return ;
}
HDU1045 Fire Net(DFS)的更多相关文章
- 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 ...
- ZOJ 1002 Fire Net(dfs)
嗯... 题目链接:https://zoj.pintia.cn/problem-sets/91827364500/problems/91827364501 这道题是想出来则是一道很简单的dfs: 将一 ...
- Fire Net(dfs)
Fire Net Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- hdu 1045 Fire Net(dfs)
Fire Net Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- LeetCode Subsets II (DFS)
题意: 给一个集合,有n个可能相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: 看这个就差不多了.LEETCODE SUBSETS (DFS) class Solution { publ ...
- LeetCode Subsets (DFS)
题意: 给一个集合,有n个互不相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: DFS方法:由于集合中的元素是不可能出现相同的,所以不用解决相同的元素而导致重复统计. class Sol ...
- HDU 2553 N皇后问题(dfs)
N皇后问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 在 ...
- 深搜(DFS)广搜(BFS)详解
图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...
- 【算法导论】图的深度优先搜索遍历(DFS)
关于图的存储在上一篇文章中已经讲述,在这里不在赘述.下面我们介绍图的深度优先搜索遍历(DFS). 深度优先搜索遍历实在访问了顶点vi后,访问vi的一个邻接点vj:访问vj之后,又访问vj的一个邻接点, ...
随机推荐
- linux设备驱动归纳总结(四):2.进程调度的相关概念【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-65555.html linux设备驱动归纳总结(四):2.进程调度的相关概念 xxxxxxxxxxxx ...
- h3c 交换机配置VLAN和远程管理
一.基本设置 1. console线连接成功 2. 进入系统模式 <H3C>system-view //提示符由<H3C> 变为 [H3C] 3. 更改设备名称 [H3C]sy ...
- Pascal's Triangle II
class Solution { public: vector<int> getRow(int rowIndex) { vector<int> v; ) return v; v ...
- 项目管理:CocoaPods建立私有仓库
CocoaPods是iOS,Mac下优秀的第三方包管理工具,类似于java的maven,给我们项目管理带来了极大的方便. 个人或公司在开发过程中,会积累很多可以复用的代码包,有些我们不想开源,又想像开 ...
- CI 配置验证规则
//判断表单域,提交表单显示对应的错误信息 $this->load->library('form_validation'); $config = array( ...
- 解析八大O2O典范:他们都做了什么?
随着无线技术的发展二维码的发展以及智能手机的普及,零售的解决方案不仅在在一台电脑上解决,可以从线上到线下,为消费者贯通线上线下的购物体验.人人都爱O2O,可做得好的O2O案例却并不多.要解决利益分配. ...
- northwind数据库
① Categories: 种类表相应字段:CategoryID :类型ID:CategoryName:类型名;Description:类型说明;Picture:产品样本 ② CustomerCust ...
- 新学习的语言Groovy
什么是 Groovy? Groovy 是 JVM 的一个替代语言 —替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同.在编写新应用 ...
- 进程外session
进程外session A SqlServer 1.管理员身份运行cmd 2.更换目录 cd c:\Windows\Microsoft.NET\Framework\v4.0.30319> 3. ...
- java.lang.IllegalStateException异常简单分析和简单解决
我们在做文件上传或者下载,或者过滤等操作时,可能要用到页面的输出流. 例如在JSP使用: response.reset(); response.setContentType(”application/ ...