2019 GDUT 新生专题I选集 C题(POJ - 1979)

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);
	}
}
发布了24 篇原创文章 · 获赞 1 · 访问量 685

猜你喜欢

转载自blog.csdn.net/palax0/article/details/103961078
今日推荐