#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类型的数组记录,使其不走重复的路;
不要忘记用二维数组!!!