poj 3009 dfs 对编程能力不足的认识

 好吧,这道题让我无比的虐心。有让我步入错误的不归路。题目很简单,dfs就可以,但在我ac的过程中,才知道编程能力的不足。

首先,对题目的意思开始理解错了,没有注意到You may throw it to any direction unless it is blocked immediately(Fig. 2(a)).

其二,忘了10的限制。更重要的是,对于多组数据输入,每组都要重新设定步数。

/*
poj 3009
*/
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define max 50

int w,h;
int a[max][max];
int sx,sy;
int s[][2]={{0,-1},{0,1},{-1,0},{1,0}};
int Min;

int dfs(int ax,int ay,int num)
{
	if(num>9) return 0;//no error
	
	
	for(int i=0;i<4;i++)
	{
		int x=ax,y=ay;
		int p=s[i][0];
		int q=s[i][1];
		if(x+p<0 || x+p>=h || y+q<0 || y+q>=w || a[x+p][y+q]==1)	continue;//刚开始忘了
		for(x+=p,y+=q;;x+=p,y+=q)
		{
			

			if(x<0 || x>=h || y<0 || y>=w)
				break;
			if(a[x][y]==3)
			{
				
				Min=min(num+1,Min);//num error

				return 1;
			}
			
			if(a[x][y]==1)
			{
				a[x][y]=0;
				
				dfs(x-p,y-q,num+1);//num error
				a[x][y]=1;
				break;//一定要有,表示这个方向的搜索完成
			}

		}
	}
	return 0;
	
}
int main(int argc, char const *argv[])
{
	// freopen("input","r",stdin);
	while(scanf("%d%d",&w,&h),w && h)
	{
		Min=0xffffff;
		for(int i=0;i<h;i++)
			for(int j=0;j<w;j++)
			{
				scanf("%d",&a[i][j]);
				if(a[i][j]==2) 
				{
					sx=i;
					sy=j;
				}
				
			}
			dfs(sx,sy,0);
			if(Min==0xffffff)
				printf("%d\n",-1 );
			else
		        printf("%d\n",Min ); 

	}

	return 0;
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值