#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\n",rear);
return 0;
先放一個寬度優先搜索的代碼!
試題描述:
在一個W*h的矩形廣場上,每一塊1*1的地面都鋪設了紅色或黑色瓷磚。小林同學站在某一塊黑色瓷磚上,他可以從此處出發,移動到上下左右四個相鄰的且是黑色的瓷磚上。現在他想知道,通過重復上述移動所能經過的黑色瓷磚數。
輸入:
第一行為h、w,2<=w、h<=50,之間有一個空格隔開。
以下為一個w行h列的二維字符矩陣,每個字符為“.”“#”“@”分別表示該位置為黑色瓷磚、紅色瓷磚、小林初始位置。
輸出:
輸出一行一個整數,表示小林從出發位置可以經過的黑色瓷磚數量。
輸入實例:
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
輸出實例:
59
本題是一道“聯通塊問題”;
代碼也是很容易理解的,用一個寬度優先搜索,從上下左右四個方向進行對黑色瓷磚的判斷,同時用一個bool類型的數組記錄,使其不走重復的路;
不要忘記用二維數組!!!