SDUT OJ0 2779 找朋友

题目描述

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

为了简化问题,我们把地图抽象为n*m的矩阵,行编号从上到下为1 到 n,列编号从左到右为1 到 m。矩阵中’X’表示X所在的初始坐标,’Y’表示Y的位置 , ’#’表示当前位置不能走,’ * ’表示当前位置可以通行。X每次只能向上下左右的相邻的 ’*’ 移动,每移动一次耗时1秒。

输入

多组输入。每组测试数据首先输入两个整数n,m(1<= n ,m<=15 )表示地图大小。接下来的n 行,每行m个字符。保证输入数据合法。

输出

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

示例输入

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

示例输出

4
-1

//AC 代码

#include<stdio.h>
#include<string.h>

char map_[20][20];

struct node
{
int x,y;
int tim;
} que[100010]; ///建立存储临时遍历信息的存储栈

int chx[]= {0,1,0,-1};///移动方向
int chy[]= {1,0,-1,0};///移动方向 可以竖着看,两个两个,一共四对,分别为上下左右。

bool bj[20][20]; ///标记变量,是否已经走过此地方。

int bfs(int x1,int y1,int x2,int y2,int n,int m) ///bfs搜索
{
node tmp,now; /// 建立临时存储坐标结构体
now.x=x1; ///将 X 的横坐标给初始化。
now.y=y1; ///将 X 的竖坐标给初始化。
now.tim=0; ///行走步数
int s=0,e=0; ///
memset(bj,0,sizeof(bj)); ///将标记数组清0
que[s++]=now; ///栈底的初始化为X的坐标等
bj[now.x][now.y] =1; ///标记字符数组开始已经走过

while(s>e) ///进入循环,最终s,e相等时会跳出循环,如果找到Y会在循环中就跳出的
{
now = que[e++]; /// X的坐标同样给now,只不过e++,

if(now.x == x2 && now.y==y2)
{
return now.tim; /// 等于Y时跳出,因为找到Y了,返回步数就可以。
}

for(int i=0; i<4; i++) ///i<4是因为只能有上下左右四个方向。
{
tmp=now;
tmp.x+=chx[i];
tmp.y+=chy[i];
tmp.tim++;
if(tmp.x >=0 && tmp.x <n && tmp.y >= 0 && tmp.y<m)
{
if(map_[tmp.x][tmp.y] != ‘#‘ && !bj[tmp.x][tmp.y]) ///不等于“#”或出界时继续走
{
que[s++]=tmp; ///能走的话就将坐标入栈
bj[tmp.x][tmp.y] = 1; ///并标记这个地方走过
}
}
}
}
return -1; ///搜索完毕,没有找到Y,跳出
}
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
for(int i=0; i<n; i++)
{
scanf("%s",map_[i]);
}
int a[4]= {-1,-1,-1,-1};
for(int i=0; i<n; i++) //到X和Y的坐标给变量
{
for(int j=0; j<m; j++)
{
if(map_[i][j]==‘X‘)
{
a[0]=i;
a[1]=j;
}
if(map_[i][j]==‘Y‘)
{
a[2]=i;
a[3]=j;
}
}
}

if(a[0]==-1 || a[2]==-1)
{
printf("-1\n"); ///debug后台数据,可以没有。
continue;
}

int k= bfs(a[0],a[1],a[2],a[3],n,m); ///输出。
printf("%d\n",k);
}
return 0;
}

时间: 2024-08-07 08:39:34

SDUT OJ0 2779 找朋友的相关文章

hunnu--11548--找啊找啊找朋友

找啊找啊找朋友 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 14, Accepted users: 11 Problem 11548 : No special judgement Problem description   小明和小红是一对好朋友,小明一有空就去找小红玩.但是小红飘忽的行踪让小明很是伤脑筋. 小红居住的小区的地下有当年抗战时期留下的地道,小红平时总是

CNUOJ 0290 找朋友

找朋友 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 现在有N个人在找朋友.如果a和b是朋友,b和c是朋友,那么a和c也是朋友.XJR是所有人的朋友(人缘好吧),知道M个信息,每次知道一对朋友.那么请你回答每个人有多少朋友呢? 输入 第一行,两个数N(N<=100000).M,分别表示有多少人以及XJR所知道的信息的数量.接下来M行,每行有两个不同的数x(1<=x<=N).y(1<=y<=N),表示x与

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

1463 找朋友  基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80 难度:5级算法题  收藏  关注 给定: 两个长度为n的数列A .B 一个有m个元素的集合K 询问Q次 每次询问[l,r],输出区间内满足|Bi-Bj|∈K 的最大Ai+Aj 数据约定: n,Q<=100000 m <= 10 0<=A[i]<=1000000000 1<=B[i]<=n 1<=K[i]<=n 保证B[i]互不相等 Input n Q m A1 A2 .

1024,节日快乐!找呀找呀找朋友(来自世纪佳缘的小偷爬虫程序)

十月二十四日,1024,程序员的节日~ 祝大家 节日快乐了! 今晚别加班,下面给你吃! 不要委屈了自己,晚上回家吃顿好的把. 正文 一直都对爬虫,数据方面挺感兴趣的,也爬过很多数据.当然了,必须使用的是c#了~~ 今天公布一个很早之前做的小偷程序.数据来自世纪佳缘. Demo: find.izk.cloud 无图无真相 说明 我是直接在世纪佳缘的页面找到接口地址,然后构造相关参数,进行post请求,然后数据就出来了...就这样出来了!!! 像这种公开了接口,还没做任何限制的,简直是...不要太简

TYVJ P1082 找朋友 Label:字符串

描述 童年的我们,对各种事物充满了好奇与向往.这天,小朋友们对数字产生了兴趣,并且想和数字交朋友.可是,怎么分配这些数字才能使得每个小朋友都唯一地找到一个数字朋友呢?C小朋友说:咱们按自己名字的字典序先后,依次选择一个剩余的最小的数字当朋友.好么?Q小朋友十分赞同.于是,大家都同意了. 输入格式 第一行为一个数n,为小朋友数和数字数.下面n行为小朋友们的名字.再下面n行为候选的n个数字. 输出格式 n行,按字典序输出n个小朋友姓名及所选的数字朋友. 测试样例1 输入 5 src oldway c

icodelab 找朋友(P4397 [JLOI2014]聪明的燕姿)

描述 老师给每个同学一个号码牌,假设小明的号码牌上写着数字 S,那么其他那些手上的号码牌数字的所有正约数之和等于 S的同学就是小明的朋友. 输入 输入包含 k 组数据. 对于每组数据,输入包含一个数字S. 输出 对于每组数据,输出有两行,第一行包含一个整数 m,表示有 m 个小明的朋友. 第二行包含相应的 m 个数,表示小明朋友的手中的数字. 注意:你输出的数字必须按照升序排列. 输入样例 1 42 输出样例 1 3 20 26 41 提示 对于 100%的数据,k≤100, S≤2×10^9

51nod 1463 找朋友(线段树+离线处理)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1463 题意: 思路: 好题! 先对所有查询进行离线处理,按照右区间排序,因为k一共最多只有10个,所有在该区间内的B数组,每次枚举K值,通过这样的方式来得到另外一个B值.但是这样得到的B值它在B数组中的位置必须在当前数的左边.如下图:(j为当前数在B数组中的位置,pos为计算得到的另一个B值在数组中的位置) 这两个数的和记录在pos中,这里pos的位置必须在j的左边,假

BZOJ4264 : 小C找朋友

若x与y可能成为好*友,那么它们连出去的点除了x和y之外都相同. 于是给每个点一个long long的随机权值,然后每个点的hash值为与其相连的点的权值的异或和,若两个点hash值相等,则可行. 给每个点的hash值异或上自己本身的权值再求一次即可得到正确答案. 时间复杂度$O(n\log n)$. #include<cstdio> #include<algorithm> #define N 1000010 typedef long long ll; int n,m,i,j,x,

【最小表示法】BZOJ1398-寻找朋友

[题目大意] 判断两个字符串是否循环同构. [思路] 我一开始的做法是直接同时在两个字符串上求最小表示法,只有部分测试点能过,理由未知,以后再来思考. 现在做法:分别求出两个字符串的最小表示法,再比较是否相等. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int MAXN=100