#include <iostream>
#include <algorithm>
using namespace std;
const int M=25;
int g[M][M],w,h,sx,sy,ex,ey,ans=1<<5;
typedef struct{
int x;
int y;
}Move;
Move move[4]={{-1,0},{1,0},{0,-1},{0,1}};
void dfs(int cur,int x,int y)
{
if(cur<=10)
{
if(cur>=ans) return;
int a,b;
for(int i=0;i<4;i++)
{
a=x+move[i].x;
b=y+move[i].y;
if(g[a][b]==1||a<1||a>h||b<1||b>w) continue; //相邻是block 不能走
while(a>=1&&a<=h&&b>=1&&b<=w&&g[a][b]!=1)
{
if(a==ex&&b==ey)
{
if(cur+1>10) break; //
ans=min(ans,cur+1);
}
a+=move[i].x;
b+=move[i].y;
}
if(cur+1>10&&a==ex&&b==ey) continue;
if(a>=1&&a<=h&&b>=1&&b<=w)
{
g[a][b]=0;
dfs(cur+1,a-move[i].x,b-move[i].y); //在block之前停下 并且在map内
g[a][b]=1; //回溯
}
}
}
}
int main()
{
int i,j,k;
while(cin>>w>>h&&(w+h))
{
ans=1<<5;
for(i=1;i<=h;i++)
{
for(j=1;j<=w;j++)
{
cin>>g[i][j];
if(g[i][j]==2)
{
sx=i;
sy=j;
}
if(g[i][j]==3)
{
ex=i;
ey=j;
}
}
}
dfs(0,sx,sy);
if(ans!=1<<5)
cout<<ans<<endl;
else
cout<<-1<<endl;
}
return 0;
}
poj 3009 dfs
最新推荐文章于 2020-05-02 10:22:49 发布