找朋友

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描写叙述

X,作为户外运动的忠实爱好者,总是不想呆在家里。如今,他想把死宅Y从家里拉出来。问从X的家到Y的家的最短时间是多少。

为了简化问题,我们把地图抽象为n*n的矩阵。行编号从上到下为1 到 n,列编号从左到右为1 到 n。

矩阵中’X’表示X所在的初始坐标。’Y’表示Y的位置 , ’#’表示当前位置不能走。’ * ’表示当前位置能够通行。X每次仅仅能向上下左右的相邻的 ’*’ 移动,每移动一次耗时1秒。

输入

多组输入。每组測试数据首先输入两个整数n。m(1<= n ,m<=15 )表示地图大小。

接下来的n 行,每行n个字符。保证输入数据合法。

输出

若X能够到达Y的家,输出最少时间,否则输出 -1。

演示样例输入

3 3
X#Y
***
#*#
3 3
X#Y
*#*
#*#

演示样例输出

4
-1

提示

 
4个搜索方向,上下左右,感觉dfs不太适合这类题,太慢。尤其是按不同的搜索顺序,比方按上下右左搜,居然TLE。。

略微调了一下方向 70ms过

bfs就好多了,搜到了直接退出。
#include <cstdio>//BFS
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
char ma[20][20];
bool vis[20][20];
typedef struct node
{
int x;
int y;
int time;
};
int n,m;
int mov[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void bfs(int x,int y)
{
queue <node> Q;
node t;
t.x=x;t.y=y;t.time=0;
Q.push(t);
vis[x][y]=1;
while(!Q.empty())
{
node v=Q.front();Q.pop();
if(ma[v.x][v.y]=='Y')
{
cout<<v.time<<endl;
return ;
}
for(int i=0;i<4;i++)
{
t.x=v.x+mov[i][0];
t.y=v.y+mov[i][1];
if(0<=t.x&&t.x<n&&0<=t.y&&t.y<m&&!vis[t.x][t.y]&&ma[t.x][t.y]!='#')
{
t.time=v.time+1;
vis[t.x][t.y]=1;
Q.push(t);
}
}
}
puts("-1");
} int main()
{
int i,j;
while(cin>>n>>m)
{
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
cin>>ma[i];
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(ma[i][j]=='X')
break;
}
if(j<m)
break;
}
bfs(i,j);
}
return 0;
}

#include <cstdio>//DFS
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
const int INF=1<<20; struct node
{
int x,y,ans;
};
char ma[16][16];
int vis[16][16];
int n,m,mi;
int mv[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
void DFS(int x,int y,int ans)
{
if(ans>=mi)
{
return ;
}
if(ma[x][y]=='Y')
{
if(ans<mi)
{
mi=ans;
}
return ;
}
node f;
for(int i=0;i<4;i++)
{
f.x=x+mv[i][0];
f.y=y+mv[i][1];
if(0<=f.x&&f.x<n&&0<=f.y&&f.y<m&&!vis[f.x][f.y]&&ma[f.x][f.y]!='#')
{
vis[f.x][f.y]=1;
DFS(f.x,f.y,ans+1);
vis[f.x][f.y]=0;
}
}
}
int main()
{ while(~scanf("%d%d",&n,&m))
{
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
scanf("%*c%s",ma[i]);
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(ma[i][j]=='X')
{
break;
}
}
if(j<m)
break;
}
mi=INF;
vis[i][j]=1;
DFS(i,j,0);
if(mi<INF)
printf("%d\n",mi);
else
puts("-1");
}
return 0;
}

SDUT--找朋友(BFS&amp;&amp;DFS)的更多相关文章

  1. UVA10410-Tree Reconstruction(BFS序和DFS序的性质)

    Problem UVA10410-Tree Reconstruction Accept:708  Submit:4330 Time Limit: 3000 mSec Problem Descripti ...

  2. 51nod 1463 找朋友 (扫描线+线段树)

    1463 找朋友  基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80 难度:5级算法题  收藏  关注 给定: 两个长度为n的数列A .B 一个有m个元素的集合K 询问Q次 每次询 ...

  3. hunnu--11548--找啊找啊找朋友

    找啊找啊找朋友 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 14,  ...

  4. 【BZOJ4264】小C找朋友 随机化

    [BZOJ4264]小C找朋友 Description 幼儿园里有N个小C,两个小C之间可能是朋友也可能不是.所有小C之间的朋友关系构成了一个无向图,这个无向图中有M条边. 园长ATM发现对于两个(不 ...

  5. Java程序设计——反转字符串 & 找朋友 & 计算int型二进制1的个数 & 情报加密 & 计算日期 & 求近似数 & 输出较小数(练习1)

    作为刚刚入门Java的选手,其实C++的功底起到了很大的作用.但是,Java之于C++最大的不同,我个人认为,是其类的多样性.才入门的我,写着老师布置的简单的面对过程的题,如果是C++,可以算是简单了 ...

  6. 懒羊羊找朋友(struct实现优先排序)

    4907: 懒羊羊找朋友(点击) 时间限制: 1 Sec  内存限制: 128 MB                                                           ...

  7. BFS(广搜)DFS(深搜)算法解析

    图是一种灵活的数据结构,一般作为一种模型用来定义对象之间的关系或联系.对象由顶点(V)表示,而对象之间的关系或者关联则通过图的边(E)来表示. 图可以分为有向图和无向图,一般用G=(V,E)来表示图. ...

  8. 队列和 BFS —— 栈和 DFS

    队列和 BFS: 广度优先搜索(BFS)的一个常见应用是找出从根结点到目标结点的最短路径. 示例 这里我们提供一个示例来说明如何使用 BFS 来找出根结点 A 和目标结点 G 之间的最短路径. 洞悉 ...

  9. [LeetCode] Combinations (bfs bad、dfs 递归 accept)

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...

随机推荐

  1. (转)淘淘商城系列——maven工程debug调试

    http://blog.csdn.net/yerenyuan_pku/article/details/72784074 上文我们已经实现了商品列表展示的功能,在实际开发中我们肯定是要经常对maven工 ...

  2. create_module - 生成一条可加载模块记录

    总览 #include <linux/module.h> caddr_t create_module(const char *name, size_t size); 描述 create_m ...

  3. C#readonly 关键字与 const 关键字的区别

    1. const 字段只能在该字段的声明中初始化,readonly 字段可以在声明或构造函数中初始化.因此,根据所使用的构造函数,readonly 字段可能具有不同的值. 2. const 字段是编译 ...

  4. 18mybatis

    18mybatis-2018/08/02 1.mybatis标签 定义SQL语句 id :唯一的标识符 parameterType:传给此语句的参数的全路径名或别名例:com.test.poso.Us ...

  5. 题解 P1967 货车运输

    题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能 ...

  6. 笔试算法题(15):-1到N中包含1的数字的个数 & 连续和为N的序列

    出题:输入一个整数N,求从1到N这N个整数的十进制表示中‘1’出现的次数: 分析: 从左向右处理string表示的数字:当前数字长度为n,判断最左边一位数字字符: 如果是0,则直接递归下一位: 如果是 ...

  7. 【spring】jar包详解与模块依赖关系

    以spring3.X为例 jar包详解 1. spring-core.jar:包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心: 2. spri ...

  8. tcpdump用于抓取tcp数据包

    一.简单使用:-c监听次数.-v打印详情.host后接监听地址 1.1.监听 tcpdump -c -v host www.baidu.com 1.2.访问被监听的网址: 1.3.查看监听的数据:

  9. Yahoo前端优化的35条军规

    摘要:无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化34条军规,不过现在已经是35条了,所以可以说是雅虎前端优化的35条军 ...

  10. Dijkstra算法C++实现总结

    问题描述 求无负权图中点s到点t的最短凝聚力 备注 标准说法中,"缩短"/"松弛"(relax)操作是对边进行的.下面为了行文方便,将其拓展到点.即以下操作,其 ...