dfs&&bfs(应用4条路径)

找朋友
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;
}

猜你喜欢

转载自blog.csdn.net/BHliuhan/article/details/81706885
今日推荐