好吧,这道题让我无比的虐心。有让我步入错误的不归路。题目很简单,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;
}