广度搜索

Description

There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can‘t move on red tiles, he can move only on black tiles.

Write a program to count the number of black tiles which he can reach by repeating the moves described above.

Input

The input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20.

There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.

‘.‘ - a black tile 
‘#‘ - a red tile 
‘@‘ - a man on a black tile(appears exactly once in a data set)

Output

For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=30;
int n,m,ans;
char map[maxn][maxn];
bool vis[maxn][maxn];
int qx[maxn*maxn],qy[maxn*maxn];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

void bfs(int x,int y)
{
    int l=0,r=0;
    qx[r]=x;qy[r]=y;r++;
    vis[x][y]=1;
    ans++;
    while(l<r)
    {
        int curx=qx[l],cury=qy[l];l++;//当前位置
        for(int i=0;i<4;i++)
        {
            int nx=curx+dir[i][0];
            int ny=cury+dir[i][1];
            if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&!vis[nx][ny]&&map[nx][ny]!=‘#‘)
            {
                ans++;
                vis[nx][ny]=1;
                qx[r]=nx;
                qy[r]=ny;
                r++;
            }
        }
    }
}

int main()
{
    int i,j,sx,sy;
    while(scanf("%d%d",&m,&n)==2&&(n||m))
    {
        for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            cin>>map[i][j];
            if(map[i][j]==‘@‘)
            sx=i,sy=j;
        }
        ans=0;
        memset(vis,0,sizeof(vis));
        bfs(sx,sy);
        cout<<ans<<endl;
    }
    return 0;
}

时间: 2024-10-21 21:57:14

广度搜索的相关文章

创建二叉树 树的深度搜索 广度搜索

树的深度搜索 与树的前序遍历同理 根节点->左孩子->右孩子  树的广度搜索 与树的层次遍历同理 一层一层遍历内容 深度搜索 采用stack的适配器 先进后出原则  而广度搜索采用的queue适配器 先进先出原则 二者正好满足 搜索需求 简要代码如下: #include <iostream> #include <stack> #include <queue> #include <malloc.h> using namespace std; typ

八数码问题:C++广度搜索实现

毕竟新手上路23333,有谬误还请指正. 课程设计遇到八数码问题(这也是一坨),也查过一些资料并不喜欢用类函数写感觉这样规模小些的问题没有必要,一开始用深度搜索却发现深搜会陷入无底洞,如果设定了深度限制又会有很多情况无法找到,然后果断放弃,改用广度搜索.  如果要改善代码效率还可以用双向搜索,即从起始状态和最终状态同时搜索,找到相同状态,这样搜索时间会缩短一半.此外还可以用A*(启发式算法)会显得高端很多. 题目要求: 在一个3*3的棋盘上,随机放置1到8的数字棋子,剩下一个空位.数字可以移动到

迷宫-广度搜索

#include <iostream>#include <string>using namespace std; const int N=100;const int M=100; typedef struct //定义迷宫结构 { char c; short int p_row,p_col,step;}Maze; Maze a[N][M]; bool pathed[N][M]; //留下足迹数组short int p[4][2]={-1,0,0,1,1,0,0,-1};//行走方向

图的深度及广度搜索

今天来学习下,图的遍历方法,我们以下面这个图为例. 开始之前呢,先说个题外话,我们用最常用的二维数组来存这个图,专业的叫法是邻接矩阵法,这好像不是题外话吧!!^_^要不要先自己想一下,上面这个图用邻接矩阵怎么存呢! 废话不多说,先来个深度的吧: 那什么叫深度搜索呢:以一个未访问过的顶点(图由顶点和边组成,不要说你不知道哦!)为起点,沿着当前顶点边走到未访问过的顶点,当没有未访问过的顶点时,回到该顶点的上一个顶点,继续走到其未访问过的顶点,直到所有顶点都被访问过.对文字不太感冒?来看下面的incl

基于C++ STL图的邻接表表示及深度、广度搜索实现

基于C++ STL图的邻接表表示及深度.广度搜索实现,对图论的学习有帮助,代码如下: #include <iostream> #include <vector> #include <set> using namespace std; #define MAX(a, b) ((a) > (b) ? (a) : (b) ) //定义图的定点 typedef struct Vertex { int id; vector<int> connectors; //存

迷宫问题解决方法:分别基于深度搜索和广度搜索的思想来实现

本文针对迷宫问题,探讨解决思路并给出实现代码.在本文中,采用的图的深度优先搜索和广度优先搜索两种方法分别对迷宫的路径进行了求解. 首先来看迷宫问题的描述,可以参考此处,简而言之就是,通过一个二维数组(int型)来表示迷宫,迷宫中0表示可行,1表示不可行.在本文的实现中,可以输入给定迷宫,定义迷宫入口和出口,并查找迷宫路径. 总体的描述:在本文中,定义了结构体Node,用于存放节点信息,而Node内只有两个变量,标识节点的行坐标与列坐标.定义了迷宫类maze,并分别定义了相应的get.set函数,

第四章 搜索(深度、广度搜索、全排列、走迷宫、再解炸弹人、宝岛探险、水管工游戏)

一.深度优先搜索DFS 深度优先搜索DFS的关键思想是:当下应该怎么做(每个方法都试一遍),这一步解决后,进入下一步,下一步的解决方法和这一步的解决方法是一样的 DFS的基本模型 void dfs(int step) { 判断边界 尝试每一种可能  for(i=1;i<=n;i++) { 继续下一步 dfs(step+1) } 返回 } 1.1全排列 1 //输入一个数n 2 //输出1-n的全排列 3 #include <stdio.h> 4 int n, book[10], a[10

一步两步学算法之图的广度搜索

bfs利用队列搜索    详细看代码 #define VERTEX_MAX 26 //图的最大定点数 #define MAXVALUE 32767 //最大值 #include "stdio.h" #define QUEUE_MAXSIZE 10 //队列最大容量 typedef struct { char Vertex[VERTEX_MAX]; //保存定点信息的数组 int Edges[VERTEX_MAX][VERTEX_MAX]; //边的权 int IsTrav[VERTEX

C语言实现的图的深度搜索与广度搜索程序

/* 上机试验5-图的建立和遍历 1)建立[无向][非连通]图的邻接表存储结构,要求顶点个数不少于15个. 2)用DFS及BFS对此邻接表进行遍历,打印出两种遍历的顶点访问顺序. 3)给定图中任意两个顶点v1和v2及整数k,判断是否存在从v1到v2的路径长度为k的简单路径,若有打印出路径上的顶点序列(要求路径上不含回路). 进一步:找出从v1到v2的所有路径长度为k的[简单]路径.(简单路径是指:顶点序列中不含[重现]的顶点的路径.) */ #include<memory> #include&

修道士与野人问题(BFS广度搜索)

#include "iostream.h" #include "string.h" //定义一个状态节点 typedef struct //存储各个状态 { int x,y,s;//修道士人数,野人人数,s=0左岸s=1右岸 }state; typedef struct edge { int verNo;//顶点号: int x_boat,y_boat,di;//船上修道士人数,船上野人人数,方向,di=1向右,di=0向左 struct edge* next; }