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的一个邻接点, ...
随机推荐
- Mac OS finder : 显示和隐藏文件[夹] show and hide files or folders
Finder默认是不显示隐藏文件[夹]的,要显示出怎么办? 要显示的话,可以GUI(graphic user interface)和CLI(command line interface)两种方式 CL ...
- oralce创建用户
oralce创建用户: sqlplus /nolog回车 -->conn esun/esun@esuntech; -->create user xlh identified by pass ...
- PHP中判断字符串是否含有中文
<?php /** * [1.测试一] * 当$str = '中文测试'; 时输出"全部是汉字";当$str = '中a文3测试'; 时输出"不全是汉字" ...
- MySQL连接字符串总结
一.MySQL Connector/ODBC 2.50 (MyODBC 2.50)连接方式 1.本地数据库连接 Driver={MySQL};Server=localhost;Option=16834 ...
- java 面试每日一题
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? import java.util.Scanner; public cl ...
- JAVA中int、String的类型相互转换
int -> String int i=12345;String s="";第一种方法:s=i+"";第二种方法:s=String.valueOf(i); ...
- $q服务的API详解
下面我们通过讲解$q的API让你更多的了解promise异步编程模式.$q是做为angularjs的一个服务而存在的,只是对promise异步编程模式的一个简化实现版,源码中剔除注释实现代码也就二百多 ...
- js格式化日期 年月日
/** * 格式化日期 * @param value * @param row ...
- 周赛-KIDx's Pagination 分类: 比赛 2015-08-02 08:23 7人阅读 评论(0) 收藏
KIDx's Pagination Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) S ...
- IP Address 分类: POJ 2015-06-12 19:34 12人阅读 评论(0) 收藏
IP Address Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 19125 Accepted: 11053 Desc ...