SDUTOJ 2779 找朋友(BFS&&DFS)

来源:互联网 发布:htpp js.shxedc.com 编辑:程序博客网 时间:2024/05/19 13:25

BFS--广度优先搜索    先把同层的找完,再往下一层去找。用队列实现。

#include<stdio.h>#include<string.h>using namespace std;struct node{    int x,y;    int t;}que[200];char mp[20][20];bool vis[20][20];int chx[]={0,0,1,-1};   //四个方向int chy[]={1,-1,0,0};int bfs(int x,int y,int n,int m){    int i,j;    int s=0,e=0;    struct node now,tmp;    now.x=x;                //初始化    now.y=y;    now.t=0;    que[s++]=now;           //第一个点进队列    vis[x][y]=1;    while(s>e)    {        now=que[e++];       //出队列        if(mp[now.x][now.y]=='Y')            return now.t;        for(i=0;i<4;i++)        {            tmp.x=now.x+chx[i];            tmp.y=now.y+chy[i];            tmp.t=now.t+1;            if(tmp.x>=0&&tmp.x<n&&tmp.y>=0&&tmp.y<m&&!vis[tmp.x][tmp.y]&&mp[tmp.x][tmp.y]!='#')            {                que[s++]=tmp;           //符合条件,进队列                vis[tmp.x][tmp.y]=1;    //标记为1,不再经过此点            }        }    }    return -1;      //不能找到Y点,返回值为-1}int main(){    int n,m,i,j;    while(~scanf("%d%d",&n,&m))    {        memset(vis,0,sizeof(vis));  //标记数组初始化        for(i=0;i<n;i++)            scanf("%*c%s",mp[i]);        for(i=0;i<n;i++)            //找到X的坐标        {            for(j=0;j<m;j++)            {                if(mp[i][j]=='X')                    break;            }            if(j<m)                break;        }       int ans = bfs(i,j,n,m);       printf("%d\n",ans);    }    return 0;}

DFS--深度优先搜索 :对于最新发现的顶点,如果它还有以此为起点还未发现的边,就继续搜索下去。直到当前点的所有方向都已搜索完毕不符合条件了,就往前回溯。

#include<stdio.h>#include<string.h>using namespace std;const int inf = 1<<20;char mp[20][20];bool vis[20][20];int mini;int chx[]={0,0,1,-1};int chy[]={1,-1,0,0};struct node{    int x,y;};void dfs(int x,int y,int n,int m,int ans){    int i,j;    struct node tmp;    if(ans>=mini)        return ;    if(ans<mini&&mp[x][y]=='Y')    {        mini=ans;        return ;    }    for(i=0;i<4;i++)    {        tmp.x=x+chx[i];        tmp.y=y+chy[i];        if(tmp.x>=0&&tmp.x<n&&tmp.y>=0&&tmp.y<m&&!vis[tmp.x][tmp.y]&&mp[tmp.x][tmp.y]!='#')        {            vis[tmp.x][tmp.y]=1;            dfs(tmp.x,tmp.y,n,m,ans+1);            vis[tmp.x][tmp.y]=0;        }    }}int main(){    int n,m,i,j;    while(~scanf("%d%d",&n,&m))    {        mini=inf;        memset(vis,0,sizeof(vis));        for(i=0;i<n;i++)            scanf("%*c%s",mp[i]);        for(i=0;i<n;i++)        {            for(j=0;j<m;j++)            {                if(mp[i][j]=='X')                    break;            }            if(j<m)                break;        }        int ans=0;        vis[i][j]=1;        dfs(i,j,n,m,ans);        if(mini==inf)        printf("-1\n");        else        printf("%d\n",mini);    }    return 0;}

























































0 0