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

1.1979 Red and Black

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


#include<iostream>
#include<memory.h>
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<w&&b>=0&&b<h&&arr[a][b]!='#'&&vis[a][b]==0)
					{
						t++;
						queue[t].x=a;
						queue[t].y=b;
						queue[t].step=queue[t-1].step+1;//可以走时,入队;
						vis[a][b]=1;
					}
			}
		}
		return queue[t].step;
	}
	
	int main(){
	
		int i,j,count,a,b;
		while(scanf("%d%d",&h,&w)!=EOF)
		{
			if(!h&&!w)
				break;
		for(i=0;i<w;i++){
			scanf("%s",&arr[i]);
			for(j=0;j<h;j++)
			if(arr[i][j]=='@'){
				a=i;
				b=j;
				
			}
		}	
		count=bfs(a,b);
		printf("%d\n",count);
		}
				return 0;
				}


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步,这样的。









  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值