POJ 1979 基础搜索 DFS\BFS 一

  遥想各位大佬都在努力刷题学习,明明可以靠天赋,依然这么努力的拼搏。

  实在忍不住做起Vjudge,进一步发现自己的愚蠢.....快哭了

 

  首先来了一道手速题,POJ 1979    : http://poj.org/problem?id=1979

  题意: 一个矩阵,问起点出发,有几个可达位置数。 

  作为菜鸟,我先写了不熟练的BFS,然后再写了DFS。 交了就过了。 然而这么简单的题目我就写了2小时。做题实在太少,各种细节错误,字符打错什么的。  O__O "…抠脚

  写BFS的思路是:

   队列开始装入首点。  

  取点;判断是否踩过,踩过就过,否则计数标记并接下去;                                   (取出再踩,踩未踩的,踩了再拓展)不够清晰

  将周围的不越界的点都放入队列     ——(重复至空)

 

  写DFS的思路是:

                               判断此点有无越界,判断此点是否踩过                            (递归终止条件)

                               未踩过标记并就对此点各方向递归                                   (递归实现内容)

 

  很久没写了,写搜索非常艰难以及思维混乱

  BFS代码:

 

#include"cstdio"
#include"cstring"
#include"queue"
using namespace std;
#define loop(x,y,z) for(x=y;x<z;x++)

int n,m,ans;
char pos[21][21];
int book[21][21];
int change[4][2]={-1,0,1,0,0,1,0,-1};

int pan(int i,int j)
{
    if(i<0||i>=n||j<0||j>=m)return 0;
    if(pos[i][j]=='.'||pos[i][j]=='@')return 1;
    return 0;
}

struct node{
    int x,y;
    node(int i,int j)
    {
        x=i;
        y=j;
    }
};

void BFS(int beginx,int beginy)
{
    queue<node>q;
    q.push(node(beginx,beginy));
    while(!q.empty())
    {
        node t=q.front();
        q.pop();
        int x=t.x;
        int y=t.y;
        if(book[x][y])continue;
        book[x][y]=1;
        ans++;

        int i;
        loop(i,0,4)
        {
            int& _x=change[i][0];
            int& _y=change[i][1];
            if(!pan(x+_x,y+_y))continue;
            q.push(node(x+_x,y+_y));
        }
    }
}

int main()
{
    int i,j;
    int beginx,beginy;

    while(~scanf("%d%d",&m,&n))
    {
        if(m==0&&n==0)break;
        loop(i,0,n)
            scanf("%s",pos[i]);

        loop(i,0,n)
            loop(j,0,m)
            if(pos[i][j]=='@')
            {
                beginx=i;
                beginy=j;
                break;
            }
        memset(book,0,sizeof book);
        ans=0;
        BFS(beginx,beginy);
        printf("%d\n",ans);
    }
    return 0;

}

 

 

  DFS代码:

 

#include"cstdio"
#include"cstring"
#define loop(x,y,z) for(x=y;x<z;x++)

int n,m,ans;
char pos[21][21];
int book[21][21];
int change[4][2]={-1,0,1,0,0,1,0,-1};

int pan(int i,int j)
{
    if(i<0||i>=n||j<0||j>=m)return 0;
    if(pos[i][j]=='.'||pos[i][j]=='@')return 1;
    return 0;
}

void dfs(int i,int j)
{
    if(!pan(i,j))return;
    if(book[i][j])return;
    book[i][j]=1;
    ans++;
    int k;
    loop(k,0,4)
    {
        int &x=change[k][0];
        int &y=change[k][1];
        dfs(i+x,j+y);
    }
}

int main()
{
    int i,j;
    int beginx,beginy;

    while(~scanf("%d%d",&m,&n))
    {
        if(m==0&&n==0)break;
        loop(i,0,n)
            scanf("%s",pos[i]);

        loop(i,0,n)
            loop(j,0,m)
            if(pos[i][j]=='@')
            {
                beginx=i;
                beginy=j;
                break;
            }
        memset(book,0,sizeof book);
        ans=0;
        dfs(beginx,beginy);
        printf("%d\n",ans);
    }
    return 0;

}

 

 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值