C++ 瓷砖

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
int n,m,dx[100],dy[100],q[400][2501];
int front =1,rear=1;
bool a[10000][1000];
char c;
int j,i,sum=0,ans=0,s,x,y,k;
int main()
{
    cin>>n>>m;
    for(i=1;i<m+1;i++)
    {
        for(j=1;j<n+1;j++)
      {
        cin>>c;
        if(c=='.')a[i][j]=true;
        else if(c=='@')
        {   
            x=i;y=j;
            a[i][j]=false;
        }
      }
      scanf("*");
    }
     
    dx[1]=1;dx[2]=-1;dx[3]=0;dx[4]=0;
    dy[1]=0;dy[2]=0;dy[3]=1;dy[4]=-1;
    q[1][1]=x;q[2][1]=y;
    front =1,rear=1;
    while(front<=rear)
    {
        for(int i=1;i<=4;i++)
        {
            x=q[1][front]+dx[i];
            y=q[2][front]+dy[i];
            if(a[x][y]){
                rear++;
                q[1][rear]=x;
                q[2][rear]=y;
                a[x][y]=false;
            }
        }
        front++;
    }
    printf("%d
",rear);
    return 0;
先放一个宽度优先搜索的代码!


试题描述:
在一个W*h的矩形广场上,每一块1*1的地面都铺设了红色或黑色瓷砖。小林同学站在某一块黑色瓷砖上,他可以从此处出发,移动到上下左右四个相邻的且是黑色的瓷砖上。现在他想知道,通过重复上述移动所能经过的黑色瓷砖数。

输入:
第一行为h、w,2<=w、h<=50,之间有一个空格隔开。
以下为一个w行h列的二维字符矩阵,每个字符为“.”“#”“@”分别表示该位置为黑色瓷砖、红色瓷砖、小林初始位置。

输出:
输出一行一个整数,表示小林从出发位置可以经过的黑色瓷砖数量。

输入实例:
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
输出实例:
59

本题是一道“联通块问题”;
代码也是很容易理解的,用一个宽度优先搜索,从上下左右四个方向进行对黑色瓷砖的判断,同时用一个bool类型的数组记录,使其不走重复的路;
不要忘记用二维数组!!!
原文地址:https://www.cnblogs.com/FXY-180/p/9369890.html