结训赛第一次复习:dfs和bfs典型例题(一)

上下走问题:

1.要设move[4][2]={ {0,1},{1,0},{0,-1},{-1,0} },通过上下走动获得答案

2.要注重对函数是否越界的判断

3.区分什么时候用dfs什么时候用bfs

dfs类型:很典型,因为要算所有路径

http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2717/pid/2449

void dfs(int x,int y)
{
    if(x==n&&y==m)//递归结束
    {
        step++;
        return ;
    }
    int next[4][2]={ {0,1},{0,-1},{1,0},{-1,0}};
    int tx,ty;
    int i;
    for(i=0;i<=3;i++)//4个方向,挨个暴力判断
    {
        tx=x+next[i][1];
        ty=y+next[i][0];
        if(tx<1||tx>n||ty<1||ty>m)
            continue ;//越界直接返回
        if(e[tx][ty]==0&&vis[tx][ty]==0)
        {
            vis[tx][ty]=1;
            dfs(tx,ty);
            vis[tx][ty]=0//这里要特别注意算的是条数,所以不能标记,不然其他路无法走了!
        }
    }
}

bfs:一下这两道题都是应用如何通过bfs达到最短,当然前提是在权值相同的情况下,权值不相同则应该用最短路径!

http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2717/pid/2779

http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2717/pid/3474

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
char tu[20][20];
int book[20][20];
int n,m;
int jx[]={0,-1,0,1};
int jy[]={1,0,-1,0};
struct node
{
    int ans;
    int x;
    int y;
}t,f;
void bfs(int x,int y)
{
    int i;
    t.x=x;
    t.y=y;
    t.ans=0;
    book[x][y]=1;
    queue<node>g;
    g.push(t);
    while(!g.empty())
    {
        f=g.front();
        g.pop();
        if(tu[f.x][f.y]=='Y')
        {
            printf("%d\n",f.ans);
            return ;
        }
        for(i=0;i<=3;i++)
        {
            t.x=f.x+jx[i];
            t.y=f.y+jy[i];
            if(t.x>=0&&t.x<n&&t.y>=0&&t.y<m&&!book[t.x][t.y]&&tu[t.x][t.y]!='#')
            {
                t.ans=f.ans+1;
                g.push(t);
                book[t.x][t.y]=1;
            }
        }
    }
    printf("-1\n");
    return ;
}
int main()
{
    int i,j;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        memset(tu,0,sizeof(tu));
        memset(book,0,sizeof(book));
        for(i=0;i<=n-1;i++)
        {
            scanf("%s",tu[i]);
        }
        int flag=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(tu[i][j]=='X')
                {
                    flag=1;
                    break;
                }
            }
            if(flag==1)
                break;
        }
        bfs(i,j);
    }
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/weixin_44067773/article/details/87882560