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思想与框架 ...
随机推荐
- vue自定义tap指令
1.Vue指令 Vue提供自定义实现指令的功能, 和组件类似,可以是全局指令和局部指令,详细可以参见vue官网自定义指令一节(https://cn.vuejs.org/v2/guide/custom- ...
- 【Jim】I am back (ง •_•)ง
其实上周就来考过一次试了,真是啥都忘了 (´ー∀ー`) 下午在写[树网的核],写了一半去吃饭,回来时发现高二机房的门被锁上了,于是他们都被堵在门口. 我就回到我的地方接着写码. 听到外面有个高二的妹子 ...
- HDU 1757 A Simple Math Problem( 矩阵快速幂 )
<font color = red , size = '4'>下列图表转载自 efreet 链接:传送门 题意:给出递推关系,求 f(k) % m 的值, 思路: 因为 k<2 * ...
- jquery中的jsonp跨域调用(接口)
jquery jsonp跨域调用接口
- redis基本数据类型和对应的底层数据结构
Redis的数据类型包含string,list,hash,set,sorted set. Redis中定义了一个对象的结构体: /* * Redis 对象 */ typedef struct redi ...
- COGS——T 2342. [SCOI2007]kshort || BZOJ——T 1073
http://www.cogs.pro/cogs/problem/problem.php?pid=2342 ★★☆ 输入文件:bzoj_1073.in 输出文件:bzoj_1073.out ...
- Go语言Slice操作.
1.基本使用方法: a = append(a, b...) 比如:list = appened(list,[]int{1,2,3,4}...) 能够用来合并两个列表. 不用这样了 :list := m ...
- ORA-01733: virtual column not allowed here
基表: hr.tt scott.tt 视图1: 基于 hr.tt union all scott.tt ---> scott.ttt 视图2: 基于 视图1->scott.ttt ...
- HDOJ 5299 Circles Game 圆嵌套+树上SG
将全部的圆化成树,然后就能够转化成树上的删边博弈问题.... Circles Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- Linux就该这么学 20181002(第二章基础命令)
参考链接https://www.linuxprobe.com/ 忘记密码操作 启动页面 默认按e 在linux16行后空格 rd.break ctrl + x mount -o remount,rw ...