C - DFS/BFS
链接
来源:POJ - 1979
题目描述
房间里有两种地砖,一种为黑色,一种为红色。一个人在黑色砖上,他只能从黑色砖移动到黑色砖上,不能移动到红色砖上。给出房间地砖的布局,求这个人能走过多少块黑色砖。
题目分析
根据题目要求,从起点开始进行bfs即可,主要是练习bfs如何用代码实现。
代码
//bfs做法
#include <cstdio>
#include <queue>
#include <utility>
using namespace std;
int sum,a,b;
int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};
char room[20][20];
typedef pair<int,int> P;//参考大佬的操作使用了pair
queue<P> q;
void bfs(P x)
{
bool visit[20][20]={0};
visit[x.first][x.second]=1;
q.push(x);
while(!q.empty()){
P temp=q.front();
//以下为测试语句,可忽略
//visit[temp.first][temp.second]=1;
//printf("here is [%d][%d],sum=%d\n",temp.first+1,temp.second+1,sum);
sum+=1;
q.pop();
for(int i=0;i<4;i++){
int tx=temp.first+dx[i],ty=temp.second+dy[i];
if(tx>=0&&ty>=0&&tx<b&&ty<a&&room[tx][ty]!='#'&&!visit[tx][ty]){
visit[tx][ty]=1;
q.push(P(tx,ty));
//以下为测试语句,可忽略
//printf("[%d][%d]has visited,visit[][]=%d\n",tx+1,ty+1,visit[tx][ty]);
}
}
}
}
int main()
{
while(scanf("%d%d",&a,&b)!=EOF&&(a||b)){
getchar();
P x;
for(int i=0;i<b;i++){
for(int j=0;j<a;j++){
scanf("%c",&room[i][j]);
if(room[i][j]=='@') x.first=i,x.second=j;
//记录起点
}
getchar();
}
sum=0;
bfs(x);
printf("%d\n",sum);
}
}