找朋友

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. gprc-java与golang分别实现服务端,客户端,跨语言通信(一.java实现)

    1.在pom中引入 <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty< ...

  3. react-native Socket Event 在控制台的输出

    在XCode中运行react-native 的时候,避免不了的要查看日志信息 ,但是react-native中的Socket的日志简直是太多了,往往是刚看到自己想要看到的信息的时候,瞬间就被最新的日志 ...

  4. 1257 背包问题 V3(二分)

    1257 背包问题 V3 3 秒 131,072 KB 80 分 5 级题 题意 : 从n个物品中选出k个,使单位体积价值最大 思路: 一开始正面想,试过很多种,排序什么的..总是结果不对,最后想到二 ...

  5. Python 1-3区分Python文件的两种用途和模块的搜索路径

    区分Python文件的两种用途 run.py文件: import m1 m1.py文件: def f1(): print('f1') def f2(): print('f2') #当文件被执行时__n ...

  6. nginx配置文件+本地测试请求转发到远程服务器+集群

    1 在本地测试1 众所周知,nginx是一个反向代理的服务器,主要功能即为实现负载均衡和动静分离.在别的我别的文章有详细的nginx(Windows)相关介绍教程. 由于自己安装的nginx在本地的计 ...

  7. 字符串str.format()方法的个人整理

    引言: 字符串的内置方法大致有40来个,但是一些常用的其实就那么20几个,而且里面还有类似的用法,区分度高比如isalpha,isalnum,isdigit,还有一些无时不刻都会用到的split切分, ...

  8. python flask获取微信用户信息报404,nginx问题

    在学习flask与微信公众号时问题,发现测试自动回复/wechat8008时正常,而测试获取微信用户信息/wechat8008/index时出现404.查询资料后收发是nginx配置问题. 在loca ...

  9. LeetCode(33)Search in Rotated Sorted Array

    题目 Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 m ...

  10. linux中的命令

    1,ln-链接 功能是为某一个文件在另外一个位置建立一个同步的链接,这个命令最常用的参数是-s,具体用法是: ln -s 源文件 目标文件  // -s 是 symbolic(符号,象征)的意思. l ...