Poj 3009 Curling 2.0

本文介绍了一种在迷宫中寻找最短路径的算法。该算法通过深度优先搜索(DFS)的方式,在四个方向上进行探索,遇到障碍物时将其清除,并记录到达终点所需的最少步数。若步数超过10,则视为失败。

题目大意:给出一个w*h的地图,0代表空地,1代表障碍物,2代表起点,3代表终点。从起点出发每次可以移动多个方格,且只能朝不是障碍物的方向移动,直到遇到障碍物才停下来,此时障碍物也将消失。如果行动次数超过10就表示失败。否则记录达到终点时的行动次数,要求输出最小的行动次数。

思路:分别朝四个可能的方向深搜。

#include <iostream>
using namespace std;
#include <stdio.h>
int w,h,beginx,beginy,endx,endy,result;
int map[22][22];
int minstep;
void DFS( int x, int y, int ctr, int direction ) {
	if (ctr>minstep)
		return;
	if (direction==1) {
		if (x+1>h||map[x+1][y]==1)
			return;
		while ((x+1<=h&&map[x+1][y]==0)||(x+1<=h&&map[x+1][y]==3)) {
			if (map[x+1][y]==3) {
				if (ctr<minstep)
					minstep=ctr;
				return;
			}
			x++;
			if (x+1>h)
				return;
			if (map[x+1][y]==1) {
				map[x+1][y]=0;
				break;
			}
		}
		DFS(x,y,ctr+1,1);
		DFS(x,y,ctr+1,2);
		DFS(x,y,ctr+1,3);
		DFS(x,y,ctr+1,4);
		map[x+1][y]=1;
	}
	else if (direction==2) {
		if (x-1<1||map[x-1][y]==1)
			return;
		while ((x-1>=1&&map[x-1][y]==0)||(x-1>=1&&map[x-1][y]==3)) {
			if (map[x-1][y]==3) {
				if (ctr<minstep)
					minstep=ctr;
				return;
			}
			x--;
			if (x-1<1)
				return;
			if (map[x-1][y]==1) {
				map[x-1][y]=0;
				break;
			}
		}
		DFS(x,y,ctr+1,1);
		DFS(x,y,ctr+1,2);
		DFS(x,y,ctr+1,3);
		DFS(x,y,ctr+1,4);
		map[x-1][y]=1;
	}
	else if (direction==3) {
		if (y+1>w||map[x][y+1]==1)
			return;
		while ((y+1<=w&&map[x][y+1]==0)||(y+1<=w&&map[x][y+1]==3)) {
			if (map[x][y+1]==3) {
				if (ctr<minstep)
					minstep=ctr;
				return;
			}
			y++;
			if (y+1>w)
				return;
			if (map[x][y+1]==1) {
				map[x][y+1]=0;
				break;
			}
		}
		DFS(x,y,ctr+1,1);
		DFS(x,y,ctr+1,2);
		DFS(x,y,ctr+1,3);
		DFS(x,y,ctr+1,4);
		map[x][y+1]=1;
	}
	else {
		if (y-1<1||map[x][y-1]==1)
			return;
		while ((y-1>=1&&map[x][y-1]==0)||(y-1>=1&&map[x][y-1]==3)) {
			if (map[x][y-1]==3) {
				if (ctr<minstep) 
					minstep=ctr;
				return;
			}
			y--;
			if (y-1<1)
				return;
			if (map[x][y-1]==1) {
				map[x][y-1]=0;
				break;
			}
		}
		DFS(x,y,ctr+1,1);
		DFS(x,y,ctr+1,2);
		DFS(x,y,ctr+1,3);
		DFS(x,y,ctr+1,4);
		map[x][y-1]=1;
	}
}
int main()
{
	int i,j,k;

	scanf("%d%d",&w,&h);
	while (!(w==0&&h==0)) {
		result=1;
		minstep=11;
		for (i=1;i<=h;i++) {
			for (j=1;j<=w;j++) {
				scanf("%d",&map[i][j]);
				if (map[i][j]==2) {
					beginx=i;
					beginy=j;
					map[i][j]=0;
				}
				if (map[i][j]==3) {
					endx=i;
					endy=j;
				}
			}
		}
		DFS(beginx,beginy,1,1);
		DFS(beginx,beginy,1,2);
		DFS(beginx,beginy,1,3);
		DFS(beginx,beginy,1,4);
		if (minstep<=10)
			printf("%d\n",minstep);
		else
			printf("-1\n");
		scanf("%d%d",&w,&h);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值