poj 3009 冰壶 DFS 一个方向搜查到底

本文介绍了一种基于深度优先搜索的游戏算法实现,用于解决冰壶游戏中的路径寻找问题。该算法通过递归的方式,考虑冰壶在碰撞冰块后的各种可能路径,最终找出达到目标所需的最少步数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

冰壶可以上下左右运动(前提上下左右的第一个位置为空)。碰到冰块则停止,冰块也将被破坏。问懂多少次能达到终点。

一个方向搜到底:

代码:

#include <iostream>
#include <algorithm>
using namespace std;
int map[30][30];
int w,h;
int minn=300000;
void dfs(int x,int y,int sum,int a,int b)  //a,b记录下一次运动的方向。
{
	if(x<0||x>=h||y<0||y>=w||sum>10)
		return ;
	if(map[x][y]==3)
	{
		minn=min(sum,minn);
		return ;
	}
	if(map[x+a][y+b]==0||map[x+a][y+b]==3)//如果下一次为空,接着运动。
		dfs(x+a,y+b,sum,a,b);
	else if(map[x+a][y+b]==1)  //否则,停止,换方向。
	{
		map[x+a][y+b]=0;
		if(map[x+1][y]!=1)
			dfs(x,y,sum+1,1,0);
		if(map[x-1][y]!=1)
			dfs(x,y,sum+1,-1,0);
		if(map[x][y+1]!=1)
			dfs(x,y,sum+1,0,1);
		if(map[x][y-1]!=1)
			dfs(x,y,sum+1,0,-1);
		map[x+a][y+b]=1;
	}
}
int main()
{
	while(cin>>w>>h&&w&&h)
	{
		minn=300000;
		int x,y;
		memset(map,0,sizeof(map)); //郁闷。没初始化,WA一次。
		for(int i=0;i<h;i++)
			for(int j=0;j<w;j++)
			{
				cin>>map[i][j];
				if(map[i][j]==2)
				{
					map[i][j]=0;
					x=i;
					y=j;
				}
			}
			if(map[x+1][y]!=1)   //判断能否运动。
				dfs(x,y,1,1,0);
			if(map[x-1][y]!=1)
				dfs(x,y,1,-1,0);
			if(map[x][y+1]!=1)
				dfs(x,y,1,0,1);
			if(map[x][y-1]!=1)
				dfs(x,y,1,0,-1);
			if(minn<=10)
				cout<<minn<<endl;
			else
				cout<<"-1\n";
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值