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的一个邻接点, ...
随机推荐
- 【python cookbook】【数据结构与算法】13.通过公共键对字典列表排序
问题:想根据一个或多个字典中的值来对列表排序 解决方案:利用operator模块中的itemgetter()函数对这类结构进行排序是非常简单的. # Sort a list of a dicts on ...
- 创建sh文件
创建sh文件 #/bin/bash v_file=$ v_type=$ v_desc=$ touch $v_file echo '#================================== ...
- HDU 5795:A Simple Nim(博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=5795 A Simple Nim Problem Description Two players take t ...
- sql server 快捷键
书签:清除所有书签. CTRL-SHIFT-F2 书签:插入或删除书签(切换). CTRL+F2 书签:移动到下一个书签. F2 功能键 书签:移动到上一个书签. SHIFT+F2 取消查询. ALT ...
- 学习JS中的小问题
1.如果载入的2个js文件中有重名函数,那么调用的时候怎么分别调? 第二个文件载入无效. 2.checkbox jQuery对象的checked属性在选中时为checked,否则为undefined: ...
- python 拷贝文件夹下所有的文件到指定文件夹(不包括目录)
1.随便简单些写了一下.直接粘结代码,只是简单的实现一下,还很多需要完善和扩展的地方,比如忽略掉后缀文件,删除文件 如果排除的某些的话可以用: sourceF.find('.后缀')>0 2.注 ...
- Viewpaer+fragment
1.碎片的动态切换: 1-1:页面填写 <FrameLayout android:id="@+id/fl_layout" android:layout_weight=&quo ...
- WPF中viewmodel层怎样得到view层的TabControl控件对象?
View层: <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns: ...
- java.lang.IllegalThreadStateException
java.lang.IllegalThreadStateException 今天遇到了这个问题.当时的情景是想要循环实现了runable的类和继承Thread类的两个线程.可是没有注意到,继承自Thr ...
- vc6
适合win7使用的: http://pan.baidu.com/s/1nt7SG57