HDU 2782 The Worm Turns (DFS)
For instance, suppose Winston wakes up in the following patch of earth (X's represent stones, all other cells contain food):
If Winston starts eating in row 0, column 3, he might pursue the following path (numbers represent order of visitation):
In this case, he chose his path very wisely: every piece of food
got eaten. Your task is to help Winston determine where he should begin
eating so that his path will visit as many food cells as possible.
Each test case begins with two positive integers, m and n , defining the
number of rows and columns of the patch of earth. Rows and columns are
numbered starting at 0, as in the figures above. Following these is a
non-negative integer r indicating the number of rocks, followed by a
list of 2r integers denoting the row and column number of each rock. The
last test case is followed by a pair of zeros. This should not be
processed. The value m×n will not exceed 625.OutputFor each test case, print the test case number (beginning with 1), followed by four values:
amount row column direction
where amount is the maximum number of pieces of food that Winston is
able to eat, (row, column) is the starting location of a path that
enables Winston to consume this much food, and direction is one of E, N,
S, W, indicating the initial direction in which Winston starts to move
along this path. If there is more than one starting location, choose the
one that is lexicographically least in terms of row and column numbers.
If there are optimal paths with the same starting location and
different starting directions, choose the first valid one in the list E,
N, S, W. Assume there is always at least one piece of food adjacent to
Winston's initial position.Sample Input
5 5
3
0 4 3 1 3 2
0 0
Sample Output
Case 1: 22 0 3 W
分析
题目大意就是给你一个地图,地图中只有两种元素,墙跟平地,然后要你求出一个人能在这个地图中走的最大距离。这个人一旦开始走路,那么他走的方向将是不变的。除非遇到墙,或者遇到地图的边,亦或者那个格子已经走过了,这个时候这个人才开始更换方向。
然后要你求出这个人能走的最大距离的起始点的位置,输出最大距离,起始点坐标,还有一开始走的方向。(E,N,S,W),如果最大距离相同,那么要输出起始点坐标的字典序最小的那个。
还有,如果四个方向都能达到最大,那么选择的方向的优先级由(E,N,S,W)往下排列。
就是爆搜,题目给的时间很大。我们可以枚举起点,对于每一个点搜索。关于输出,在搜索时按(E,N,S,W)的顺序,在更新答案时,只有当前答案大于记录答案才更新。
#include <cstdio>
#include <iostream>
#include <cmath>
#include <queue>
#include <algorithm>
#include <cstring>
#include <climits>
#define MAXN 626
#define X rx+dx[i]
#define Y ry+dy[i]
using namespace std;
int t=;
int r,m,n,g[MAXN][MAXN],ans[MAXN][MAXN],sx,sy,step,ansdd,ansx,ansy,md,maxx;
int ansd[MAXN][MAXN];
int dx[]={,,-,,},
dy[]={,,,,-};
void dfs(int x,int y)
{
for(int i=;i<=;i++)
{
int rx=x,ry=y;
if(X>=&&X<n&&Y>=&&Y<m&&g[X][Y]==)
{
if(x==sx&&y==sy) md=i;
g[X][Y]=++step;
if(step>ans[sx][sy])
ans[sx][sy]=step,
ansd[sx][sy]=md;
rx+=dx[i];ry+=dy[i];
while(X>=&&X<n&&Y>=&&Y<m&&g[X][Y]==)
{
g[X][Y]=++step;
if(step>ans[sx][sy])
ans[sx][sy]=step,
ansd[sx][sy]=md;
rx+=dx[i];ry+=dy[i];
}
dfs(rx,ry);
while(rx!=x||ry!=y)
{
g[rx][ry]=;
step--;
rx-=dx[i];ry-=dy[i];
}
}
}
}
void init()
{
memset(g,,sizeof(g));
memset(ans,,sizeof(ans));
memset(ansd,,sizeof(ansd));
ansdd=ansx=ansy=md=maxx=;
}
int main()
{
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
while()
{
init();
++t;
scanf("%d%d",&n,&m);
if(n==&&m==)return ;
scanf("%d",&r);
for(int i=;i<=r;i++)
{
int x,y;
scanf("%d%d",&x,&y);
g[x][y]=-;
}
for(int i=;i<n;i++)
for(int j=;j<m;j++)
if(g[i][j]!=-)
{
step=;sx=i;sy=j;
g[sx][sy]=-;
dfs(sx,sy);
g[sx][sy]=;
}
for(int i=;i<n;i++)
for(int j=;j<m;j++)
if(ans[i][j]>maxx)
{
maxx=ans[i][j];
ansx=i;ansy=j;
ansdd=ansd[i][j];
}
printf("Case %d: %d %d %d ",t,maxx+,ansx,ansy);
if(ansdd==) printf("E\n");
else if(ansdd==) printf("N\n");
else if(ansdd==) printf("S\n");
else if(ansdd==) printf("W\n");
}
return ;
}
HDU 2782 The Worm Turns (DFS)的更多相关文章
- 【HDOJ】2782 The Worm Turns
DFS. /* 2782 */ #include <iostream> #include <queue> #include <cstdio> #include &l ...
- hdu 2782 dfs(限定)
The Worm Turns Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- The Worm Turns
The Worm Turns Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- TOJ 1191. The Worm Turns
191. The Worm Turns Time Limit: 1.0 Seconds Memory Limit: 65536K Total Runs: 5465 Accepted Run ...
- HDU 1241 Oil Deposits --- 入门DFS
HDU 1241 题目大意:给定一块油田,求其连通块的数目.上下左右斜对角相邻的@属于同一个连通块. 解题思路:对每一个@进行dfs遍历并标记访问状态,一次dfs可以访问一个连通块,最后统计数量. / ...
- hdu 1241 Oil Deposits(DFS求连通块)
HDU 1241 Oil Deposits L -DFS Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & ...
- TJU ACM-ICPC Online Judge—1191 The Worm Turns
B - The Worm Turns Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Su ...
- HDOJ(HDU).1258 Sum It Up (DFS)
HDOJ(HDU).1258 Sum It Up (DFS) [从零开始DFS(6)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双 ...
- HDOJ(HDU).1016 Prime Ring Problem (DFS)
HDOJ(HDU).1016 Prime Ring Problem (DFS) [从零开始DFS(3)] 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架 ...
随机推荐
- Extjs获取input值的几种方法
记录一下: ExtJs获取文本框中值的几种方式 EXTHTML 1.Html文本框 如: 获取值的方式为: var tValue = Ext.getDom('test').value; 或者 var ...
- HDU 2256 Problem of Precision( 矩阵快速幂 )
链接:传送门 题意:求式子的值,并向下取整 思路: 然后使用矩阵快速幂进行求解 balabala:这道题主要是怎么将目标公式进行化简,化简到一个可以使用现有知识进行解决的一个过程!菜的扣脚...... ...
- ES6之用let,const和用var来声明变量的区别
var(掌握) 不区分变量和常量 用var声明的变量都是变量,都是可变的,我们可以随便对它进行运算操作.这样当多个人进行同一个项目时,区分变量和常量会越来越难,一不小心就会把设计为常量的数据更改了 ...
- poj 2663 Tri Tiling (状压dp+多米诺骨牌问题+滚动数组反思)
本来直接一波状压dpAC的 #include<cstdio> #include<cstring> #include<algorithm> #define REP(i ...
- 【codeforces 768F】Barrels and boxes
[题目链接]:http://codeforces.com/problemset/problem/768/F [题意] 让你把f个food和w个wine装在若干个栈里面; 每个栈只能装food或者是wi ...
- ActiveMQ学习总结(4)——业界消息队列简介
最近开发公司的短信平台,要用到消息队列,之前用的是亚马逊的SQS,考虑到后续业务发展,对消息推送的高并发要求,公司决定采用RabbitMQ来替换.借此机会开始熟悉各种MQ产品,下面先给大家简介下业界常 ...
- DCL授权命令
create user 用户名//创建用户 grant DBA to 用户名//授权 revoke //撤销权限
- 工具-VS使用GIT工具
由于VS中集成了GIT插件,本机安装了GIT工具和TortoiseGit工具,造成在VS中GIT无法同步,于是将TortoiseGit卸载,再次启用VS中的GIT插件,重新初始化GIT文件夹,问题解决 ...
- C#-单元测试知识点
指的是软件中对最小单元进行测试的一种测试方法 开发阶段的测试发现问题并解决问题是最节省时间和成本 Ctrl+R Ctrl+A 自动化执行单元测试 查看代码覆盖率,通常要达到80,90%的代码测试覆盖率 ...
- Objective-C 和 Core Foundation 对象相互转换
iOS同意Objective-C 和 Core Foundation 对象之间能够轻松的转换: CFStringRef aCFString = (CFStringRef)aNSString; NSSt ...