Dating with girls(2)

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1418    Accepted Submission(s): 393

Problem Description
If you have solved the problem Dating with
girls(1).I think you can solve this problem too.This problem is also
about dating with girls. Now you are in a maze and the girl you want to
date with is also in the maze.If you can find
the girl, then you can date with the girl.Else the girl will date with
other boys. What a pity!

The Maze is very strange. There are many stones in the maze. The stone
will disappear at time t if t is a multiple of k(2<= k <= 10), on
the other time , stones will be still there.

There are only ‘.’ or ‘#’, ’Y’, ’G’ on the map of the maze. ’.’
indicates the blank which you can move on, ‘#’ indicates stones. ’Y’
indicates the your location. ‘G’ indicates the girl's location . There
is only one ‘Y’ and one ‘G’. Every seconds you can move
left, right, up or down.
 
Input
The first line contain an integer T. Then T
cases followed. Each case begins with three integers r and c (1 <= r ,
c <= 100), and k(2 <=k <= 10).
The next r line is the map’s description.
 
Output
For each cases, if you can find the girl, output the least time in seconds, else output "Please give me another chance!".
 
Sample Input
1
6 6 2
...Y..
...#..
.#....
...#..
...#..
..#G#.
 
Sample Output
7
 
Source
 
Recommend
lcy
 
每秒移动一格, 只能上下左右移动
这道题是一个搜索的题目, 因为要求到达的最短时间, 用BFS会更好一些,
需要注意的一点是, 石头会在某个时间消失, 这样的话, 不仅在搜索时需要结合当前时间判断此地块是否有石头, 路径判重时也要注意
普通的搜索题目判重时是不能重复经过同一地块(会导致状态相同,从而重复搜索),  而这道题目中两个状态相同是指在同一地块的前提下, 距离下一次石头消失的时间相同. 因此需要用一个三维数组, vis[MAXN][MAXN][K_MAXN] 标记状态
代码:
 #include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int n,m,k,sx,sy,ex,ey;
struct haha
{
int x, y, step;
}q,temp;
char map[][];
int dir[][]={,,,-,,,-,};
int vis[][][];
void BFS()
{
int i;
q.x=sx;
q.y=sy;
q.step=;
queue<struct haha>que;
memset(vis,,sizeof(vis));
vis[sx][sy][]=;
que.push(q);
while(!que.empty())
{
temp=que.front();
que.pop();
if(temp.x==ex&&temp.y==ey)
{
printf("%d\n",temp.step);
return ;
}
for(i=;i<;i++)
{
int xx,yy;
xx=temp.x+dir[i][];
yy=temp.y+dir[i][];
if(xx>=&&xx<n&&yy>=&&yy<m&&(map[xx][yy]!='#'||(temp.step+)%k==)&&!vis[xx][yy][(temp.step+)%k])
{
q.step=temp.step+;
q.x=xx;
q.y=yy;
vis[xx][yy][(temp.step+)%k]=;
que.push(q);
}
}
}
printf("Please give me another chance!\n");
}
int main()
{
int i,j,cas;
scanf("%d",&cas);
while(cas--)
{
scanf("%d %d %d",&n,&m,&k);
for(i=;i<n;i++)
{
scanf("%s",map[i]);
for(j=;j<m;j++)
{
if(map[i][j]=='Y') {sx=i;sy=j;}
else if(map[i][j]=='G') {ex=i;ey=j;}
}
}
BFS();
}
return ;
}

HDU2579--Dating with girls(2)--(DFS, 判重)的更多相关文章

  1. UVa 10400 - Game Show Math 游戏中的数学 dfs+判重

    题意:给出一些数字和一个目标数字,要求你在数字间添加+-*/,让表达式能达到目标数字,运算符号的优先级都是一样的. 由于数据量很大,本来想用map<string>判重的,结果还是超时了,然 ...

  2. POJ 2458 DFS+判重

    题意: 思路: 搜+判重 嗯搞定 (听说有好多人用7个for写得-.) //By SiriusRen #include <bitset> #include <cstdio>0 ...

  3. 【DFS+小操作判重】【HDU2610+HDU2611】Sequence

    题意 2610 按照长度优先 位置次之 输出所有不递减序列 2611 按照长度优先 大小次之 输出所有不递减序列 题解不写了 来源于http://www.cnblogs.com/wally/archi ...

  4. poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)

    Sum It Up Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Sub ...

  5. hdu 2610 2611 dfs的判重技巧

    对于全排列枚举的数列的判重技巧 1:如果查找的是第一个元素 那么 从0开始到当前的位置看有没有出现过这个元素 出现过就pass 2: 如果查找的不是第一个元素 那么 从查找的子序列当前位置的前一个元素 ...

  6. 八数码问题+路径寻找问题+bfs(隐式图的判重操作)

    Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...

  7. poj 3131 双向搜索+hash判重

    题意: 初始状态固定(朝上的全是W,空格位置输入给出),输入初始状态的空格位置,和最终状态朝上的位置,输出要多少步才能移动到,超过30步输出-1. 简析: 每一个格子有6种状态,分别是 0WRB, 1 ...

  8. POJ1011【判重剪枝】

    题意: 给你一堆棒子,这些棒子是你从一堆一样的棒子折断而来的, 现在你忘记了是从那一堆一样的棒子的长度,让你写一个程序,求最短的长度. 思路: 首先这个棒长肯定是和的约数,且大于最大值. 然后是sor ...

  9. BFS+Hash(储存,判重) HDOJ 1067 Gap

    题目传送门 题意:一个图按照变成指定的图,问最少操作步数 分析:状态转移简单,主要是在图的存储以及判重问题,原来队列里装二维数组内存也可以,判重用神奇的hash技术 #include <bits ...

随机推荐

  1. 一步一步学EF系列【6、IOC 之AutoFac】

    前言 之前的前5篇作为EF方面的基础篇,后面我们将使用MVC+EF 并且使用IOC ,Repository,UnitOfWork,DbContext来整体来学习.因为后面要用到IOC,所以本篇先单独先 ...

  2. Chapter 16_0 面向对象编程

    Lua中的table就是一种对象. 1.table和对象一样拥有状态 2.和对象一样有一个独立的标识符(a self) 3.和对象一样,具有独立于创建者和创建地的生命周期. 对象有他们自己的操作,ta ...

  3. 洛谷-陶陶摘苹果(升级版)-BOSS战-入门综合练习1

    题目描述 Description 又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他手够不着时,他会站到椅子上再试试. 这次与NOIp2005普及组第一题不同 ...

  4. svn地址如何更改

    1.先进入平时放的更新文件的位置 2.然后右键 选中TortoiseSVN中的Relocate修改里面的完了之后输入账号和密码就好了当然你要记得密码和账号

  5. 复习TextView(查漏补缺)

    android:drawableLeft="@drawable/ic_launcher"----设置图片居左 android:paddingLeft="20dp" ...

  6. VBS 选择文件夹框

    VBS 选择文件夹框   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 on error resume Next Const  ...

  7. ASP.NET弹出提示点击确定之后再跳转页面的方法

    //ASP.NET弹出提示点击确定之后再跳转页面的方法 //弹出了提示并且通过location.href转到了DeskTop.aspx页面 Response.Write("<scrip ...

  8. hdu_1969_pie(二分)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1969 题意:看了老半天,就是有N个饼,要分给f+1个人,每个人只能一样多,不能拼凑,多余的丢弃,问每个 ...

  9. Ajax交互,浏览器接收不到服务器的Json数据(跨域问题)

    该问题的情景如下: 问题描述 Ajax的请求代码放在一台机器上,而服务器的java 路由程序放在另一个机子上,所以Ajax的url填写的是带"http://"  的地址,而不是相对 ...

  10. sscanf用法

    sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源. 1. 常见用法. 1 2 3 char buf[512] ; sscanf(" ...