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的一个邻接点, ...
随机推荐
- 战舰的STM32的SPI的逻辑分析仪设置
- oracle 11g 64w 用32位的pl/sql
1. 下载64位Oracle,解压两文件,解压完成后将文件合并,安装: 2. 下载PL/SQL,安装: 3. 下载instantclient-basic-win32-11.2.0.1.0.zip ...
- JS和CSS的多浏览器兼容(2)
2.Css的浏览器兼容性 方法一,根据不同的浏览器加载不同的css file <!DOCTYPE html> <html> <head> <title> ...
- 判断listview是上滑还是下滑的方法
方法一: 用setOnScrollListener(new AbsListView.OnScrollListener())来实现,判断滑动后显示的第一个条目 ,与滑动前的第一个条目的大小来判断, 这种 ...
- ACM题目————The Blocks Problem
代码参考:http://www.hankcs.com/program/uva-q101-the-blocks-problem.html Description Background Many area ...
- javaWEB中的HttpServlet(企业开发使用)
HttpServlet: 1). 是一个 Servlet, 继承自 GenericServlet. 针对于 HTTP 协议所定制. 2). 在 service() 方法中直接把 ServletReuq ...
- hdu5681 zxa and wifi
这道题目是不太好想的,尽管很容易看出来应该是dp,但是状态转移总觉得无从下手. 其实我们可以将状态分层,比如设$dp(i, j)$为用$i$个路由器覆盖前$j$个点所需的最小代价 我们先不考虑状态,而 ...
- 关于sql状态值
C = CHECK 约束D = 默认值或 DEFAULT 约束F = FOREIGN KEY 约束L = 日志FN = 标量函数IF = 内嵌表函数P = 存储过程PK = PRIMARY KEY 约 ...
- 【20160924】GOCVHelper 图像增强部分(3)
//顶帽去光差,radius为模板半径 Mat moveLightDiff(Mat src,int radius){ Mat dst; Mat srcclone ...
- 某些输入文件使用或覆盖了已过时的 API
android出现注: 某些输入文件使用或覆盖了已过时的 API. 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译. 注: 某些输入文件使用了未经检查或不安全的操作. 注 ...