POJ3009,Curling 2.0(搜索)

1.不越界,不往回走,相邻不为墙“1”的时候才可以移动,为防止往回走,每次移动完都将前一位置赋值为“-1”以区分
2.移动直至遇到墙“1”,或越界,或出口“3”,遇到墙,将墙变为路“0”,继续搜索,搜索完后要恢复为“1”,越界了直接进行下一次搜索,遇到出口处理完数据后直接跳出搜索

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
int map[25][25],s[2],g[2]; 
int flag,row,col,time,dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(int x,int y,int mov)
{
	if(mov>10||mov>time)	return;
	for(int i=0;i<=3;i++)
	{
		int x0=x+dir[i][0],y0=y+dir[i][1];
		if(map[x0][y0]!=-1&&map[x0][y0]!=1&&x0>=1&&x0<=row&&y0>=1&&y0<=col)
		{
			while(x0>=1&&x0<=row&&y0>=1&&y0<=col&&map[x0][y0]!=1||map[x0][y0]==3)
			{
				if(map[x0][y0]==3)
				{
					time=min(mov,time);//printf("%d %d %d\n",x0,y0,mov);
					flag=1;
					return;
				}
				x0+=dir[i][0];
				y0+=dir[i][1];
			}
			if(map[x0][y0]==1)
			{
				map[x0][y0]=0;
				x0-=dir[i][0];
				y0-=dir[i][1];
				if(x0!=x&&y0!=y)		//不能等于原来的位置
					map[x0-dir[i][0]][y0-dir[i][1]]=-1;
				dfs(x0,y0,mov+1);
				map[x0+dir[i][0]][y0+dir[i][1]]=1;
				if(x0!=x&&y0!=y)
					map[x0-dir[i][0]][y0-dir[i][1]]=0;
			}
		 } 
	}
 } 
int main()
{
	while(~scanf("%d%d",&col,&row))
	{
		if(col==0&&row==0)	break;
		memset(map,0,sizeof(map));
		for(int i=1;i<=row;i++)
			for(int j=1;j<=col;j++)
			{
				scanf("%d",&map[i][j]);
				if(map[i][j]==2)
				{
					s[0]=i;
					s[1]=j;
				}
			}
		flag=0;time=15;
		dfs(s[0],s[1],1);
		if(flag) printf("%d\n",time);
		else printf("-1\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值