找朋友
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
X,作为户外运动的忠实爱好者,总是不想呆在家里。现在,他想把死宅Y从家里拉出来。问从X的家到Y的家的最短时间是多少。
为了简化问题,我们把地图抽象为n*m的矩阵,行编号从上到下为1 到 n,列编号从左到右为1 到 m。矩阵中’X’表示X所在的初始坐标,’Y’表示Y的位置 , ’#’表示当前位置不能走,’ * ’表示当前位置可以通行。X每次只能向上下左右的相邻的 ’*’ 移动,每移动一次耗时1秒。
Input
多组输入。每组测试数据首先输入两个整数n,m(1<= n ,m<=15 )表示地图大小。接下来的n 行,每行m个字符。保证输入数据合法。
Output
若X可以到达Y的家,输出最少时间,否则输出 -1。
Sample Input
3 3
X#Y
*
3 3
X#Y
#
*
Sample Output
4
-1
Hint
Source
zmx
bfs与dfs结合;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxx 0x3f3f3f3f
char e[1000][1000];
int book[1000][1000];
int next[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int minn;
//struct node
//{
// int x,y,s;
//}q[1000];
//int bfs(int sx,int sy,int ex,int ey,int n,int m)
//{
// int head=0,tail=0;
// struct node top1,top2,top3;
// top1.x=sx;
// top1.y=sy;
// top1.s=0;
// q[++tail]=top1;
// book[sx][sy]=1;
// while(head<tail)
// {
// top2=q[++head];//向外拓展;
// int tx,ty;
// for(int i=0;i<=3;i++)
// {
// tx=top2.x+next[i][0];
// ty=top2.y+next[i][1];
// if((e[tx][ty]=='*'||e[tx][ty]=='Y')&&book[tx][ty]==0)//如果没有这一句Y,情况就是碰到Y的时候
// //进不去这个if,那路径就没有办法加一,最后输出的路径是小1的;DFS没有这一句就进不去最大值
// //更换的函数,同样也不会得到最大值;
// {
// top3.x=tx;
// top3.y=ty;
// top3.s=top2.s+1;
// q[++tail]=top3;
// book[tx][ty]=1;
// }
// if(tx==ex&&ty==ey)return q[tail].s;
// }
// }
// return -1;
//}
void dfs(int ex,int ey,int dis,int n,int m,int x,int y)
{
if(x==ex&&y==ey)
{
if(dis<minn)minn=dis;
}
else
{
int tx,ty;
for(int i=0;i<=3;i++)
{
tx=x+next[i][0];
ty=y+next[i][1];
if(tx<1||tx>n||ty<1||ty>m)continue;//不要忘记判断越界的情况;同时,这里的n,m是整个矩阵的大小,并不是重点的坐标,要分清楚;
if((e[tx][ty]=='*'||e[tx][ty]=='Y')&&book[tx][ty]==0)
{
book[tx][ty]=1;
dfs(ex,ey,dis+1,n,m,tx,ty);
book[tx][ty]=0;
}
}
}
}
int main()
{
int n,m,x1,x2,y1,y2,p;
char s[20];
while(~scanf("%d%d",&n,&m))
{
memset(book,0,sizeof(book));
for(int i=1;i<=n;i++)//以下操作是保证e里面的元素是从1开始存放的;
{
scanf("%s",s);
p=0;
for(int j=1;j<=m;j++)
{
e[i][j]=s[p++];
if(e[i][j]=='X')
{
x1=i;
y1=j;
}
else if(e[i][j]=='Y')
{
x2=i;
y2=j;
}
}
}
minn=maxx;
book[x1][y1]=1;
dfs(x2,y2,0,n,m,x1,y1);
if(minn==maxx)printf("-1\n");
else printf("%d\n",minn);
}
return 0;
}