找朋友

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. 以JSONobject形式提交http请求

    总结一下设置图标的三种方式: (1)button属性:主要用于图标大小要求不高,间隔要求也不高的场合. (2)background属性:主要用于能够以较大空间显示图标的场合. (3)drawableL ...

  2. CAD参数绘mcdbsolid对象(网页版)

    主要用到函数说明: _DMxDrawX::DrawSolid 绘McDbSolid对象.详细说明如下: 参数 说明 DOUBLE dX1 第一个点X DOUBLE dY1 第一个点Y DOUBLE d ...

  3. JFinal项目eclipse出现Unknown column 'createtime' in 'order clause' 的错误

    JFinal项目eclipse出现Unknown column 'createtime' in 'order clause' 的错误,在本次项目中的原因是我的表中的字段信息中创建时间的字段是creat ...

  4. Android图像处理之Bitmap类(1)

    Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件.本文从应用的角度,着重介绍怎么用Bitmap来实现这些 ...

  5. better-scroll的使用

    <template> <div> <div> <h2 class="h2">{{msg}}</h2> </div& ...

  6. gulp 前缀

    var gulp = require('gulp'), autoprefixer = require('gulp-autoprefixer'); gulp.task('testAutoFx', fun ...

  7. Mysql对象

    2.简介 2.1 存储过程 2.1.1什么是存储过程 存储过程就是一种类似函数的脚本,可以把多个sql语句组合起来,然后使用 call 存储过程名 来调用,从而执行这些SQL语句. 特点:一次编译,下 ...

  8. MySQL异常:Caused by: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request

    Caused by: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or cl ...

  9. 杭电 1009 FatMouse' Trade (贪心)

    Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding th ...

  10. 【Codeforces 1041D】Glider

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 二分. 枚举每一个上升区的起始位置作为起点(这样做肯定是最优的),然后如果没有掉在地上的话就尽量往右二分(只有上升区之间的间隙会让他往下掉) ...