poj入门水题--宽搜(bfs)题 1979 1562 2386 3278

1.1979 Red and Black

描述:有黑色和红色的瓷砖,1个男人站在黑色的瓷砖上,只能上下左右向黑色的瓷砖移动,现在想知道到最后他可以达到几个瓷砖。
输入:宽度W,高度H,'.'黑色砖块,'#'红色砖块,@男人所在的位置
输出:能到达的砖块数,包括一开始自己所在的位置。
解法:就是一个简单的宽搜。第一题,贴个代码仔细说一下。


#include
#include
using namespace std;
int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};//分别代表四个行进的方向,代表左右上下	
char arr[25][25];//根据题意,读入初始的位置,最大的是20,多申请几个保险。
struct node
{
	int x,y,step;
}queue[25*25];//分别代表坐标xy,和这个是第几步
int vis[25][25];//代表是否走过这个地方。
int w,h;
int bfs(int p,int q){
		memset(vis,0,sizeof(vis));
		int i,a,b,top,t;
		node temp;
		top=-1;
		t=-1;
		t++;
		vis[p][q]=1;
		queue[t].x= p;
		queue[t].y=q;//初始化队列
		queue[t].step=1;//塞入队列;
		while(t!=top){//队列不为空;
			top++;
			temp.x=queue[top].x;//pop出队列,出第一个 
			temp.y=queue[top].y;
			
			for(i=0;i<4;i++){
				a=temp.x+dir[i][0];
				b=temp.y+dir[i][1];
				if(a>=0&&a=0&&b


2.1562 Oil Deposits/2386 Lake Counting

解释:两题类似,都是利用宽搜来找有几个湖泊的。解法和上题略有不同,首先是方向,原先是上下左右4个方向,现在要变成上下左右以及对角线的4个,一共是8个方向。其次就是,上题只有1个起始点,问最多能走几步,这里是问有几个湖泊,只要顺序找出起始点,如果该起始点未被访问,则便利该点能够到达的所有位置,全部置为访问过,如此反复,只要最后计算这么宽搜了几次就可以了。


3.1915/2243Knight Moves

解释:就是要移动象棋里的骑士,首行给出case数,每个case有3行,棋盘大小,骑士的起始位置,骑士要到的位置。典型的宽搜题,换汤不换药,就是把移动的方向改成了骑士可以移动的方向。int dir[8][2]={{1,2},{-1,2},{1,-2},{-1,-2},{2,1},{-2,1},{2,-1},{-2,-1}};

还有一个地方就是原先的queue[t].step=queue[t-1].step+1;要改成que[t].step=queue[top].step+1,因为需要的是几步而不是最多能走几步,能走几步需要的是能入队列的长度,而需要几步,只是需要那一条线需要几步就可以了。走到就直接退出。

1915和2243就是输入输出个数不一样,其他基本一样,注意,1915有可能走不到,输出0。


4.3278 Catch That Cow

解释:你要去抓猫,每次可以从x到x+1,或者x-1或者2*x,问最少几步可以抓到猫。

解法:本来没想清楚,后来发现其实就是个宽搜的问题,只不过从原先的四个方向的移动一步变成了移动向前一步向后一步,移动2x步,这样的。









你可能感兴趣的:(poj水题)