HDU 1312 (BFS搜索模板题)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1312

题目大意:问迷宫中有多少个点被访问。

解题思路

DFS肯定能水过去的。这里就拍了一下BFS。

然后发现自己BFS访问标记有问题,导致某些点被重复访问了。

赶紧改了一下。

 

#include "cstdio"

#include "queue"

#include "string"

#include "cstring"

#include "iostream"

using namespace std;

int n,m,sx,sy,map[25][25],dir[4][2]={-1,0,1,0,0,-1,0,1},cnt;

bool vis[25][25];

struct status

{

    int x,y;

    status(int x,int y):x(x),y(y) {}

};

void bfs(int x,int y)

{

    queue<status> Q;

    Q.push(status(sx,sy));

    vis[sx][sy]=true;

    while(!Q.empty())

    {

        cnt++;

        status t=Q.front();Q.pop();

        for(int s=0;s<4;s++)

        {

            int X=t.x+dir[s][0],Y=t.y+dir[s][1];

            if(vis[X][Y]||X<0||X>n||Y<0||Y>m||!map[X][Y]) continue;

            vis[X][Y]=true;

            Q.push(status(X,Y));

        }

    }

}

int main()

{

    //freopen("in.txt","r",stdin);

    ios::sync_with_stdio(false);

    string tt;

    while(cin>>m>>n&&n)

    {

        cnt=0;

        memset(vis,0,sizeof(vis));

        for(int i=1;i<=n;i++)

        {

            cin>>tt;

            for(int j=0;j<tt.size();j++)

            {

                if(tt[j]=='#') map[i][j+1]=0;

                if(tt[j]=='.') map[i][j+1]=1;

                if(tt[j]=='@') {map[i][j+1]=2;sx=i;sy=j+1;}

            }

        }

        bfs(sx,sy);

        cout<<cnt<<endl;

    }



}

 

1869483 2014-10-14 14:49:59 Accepted 1312 15MS 292K 1246 B C++ Physcal

你可能感兴趣的:(HDU)