#include<cstdio>
using namespace std;
int a[21][21];
int n, m;
int sx, sy, gx, gy;
int res;
void dfs(int k, int x, int y, int d)
{
if(k>10) return;
if(d==-1) a[x+1][y]=0;
if(d==-2) a[x-1][y]=0;
if(d==1) a[x][y+1]=0;
if(d==2) a[x][y-1]=0;
int nx=x+1;
int ny=y;
int temp=0;
if(nx>=0 &&nx<n && ny>=0 &&ny<m&&a[nx][ny]==0)
temp=1;
if(temp)
{
if(nx==gx && ny==gy)
{
if(res>k+1) res=k+1;
return;
}
while(nx>=0&&nx<n)
{
if(nx==gx&&ny==gy)
{
if(res>k+1) res=k+1;
return;
}
if(a[nx][ny]==1)
break;
nx++;
}
if(nx>=0&&nx<n&&a[nx][ny]==1)
{
dfs(k+1, nx-1, ny, -1);
a[nx][ny]=1;
}
}
nx=x-1;
ny=y;
temp=0;
if(nx>=0 &&nx<n && ny>=0 &&ny<m&&a[nx][ny]==0)
temp=1;
if(temp)
{
if(nx==gx && ny==gy)
{
if(res>k+1) res=k+1;
return;
}
while(nx>=0&&nx<n)
{
if(nx==gx&&ny==gy)
{
if(res>k+1) res=k+1;
return;
}
if(a[nx][ny]==1)
break;
nx--;
}
if(nx>=0&&nx<n&&a[nx][ny]==1)
{
dfs(k+1, nx+1, ny, -2);
a[nx][ny]=1;
}
}
nx=x;
ny=y+1;
temp=0;
if(nx>=0 &&nx<n && ny>=0 &&ny<m&&a[nx][ny]==0)
temp=1;
if(temp)
{
if(nx==gx && ny==gy)
{
if(res>k+1) res=k+1;
return;
}
while(ny>=0&&ny<m)
{
if(nx==gx&&ny==gy)
{
if(res>k+1) res=k+1;
return;
}
if(a[nx][ny]==1)
break;
ny++;
}
if(ny>=0&&ny<m&&a[nx][ny]==1)
{
dfs(k+1, nx, ny-1, 1);
a[nx][ny]=1;
}
}
nx=x;
ny=y-1;
temp=0;
if(nx>=0 &&nx<n && ny>=0 &&ny<m&&a[nx][ny]==0)
temp=1;
if(temp)
{
if(nx==gx && ny==gy)
{
if(res>k+1) res=k+1;
return;
}
while(ny>=0&&ny<m)
{
if(nx==gx&&ny==gy)
{
if(res>k+1) res=k+1;
return;
}
if(a[nx][ny]==1)
break;
ny--;
}
if(ny>=0&&ny<m)
{
dfs(k+1, nx, ny+1, 2);
a[nx][ny]=1;
}
}
}
int main()
{
while(scanf("%d%d", &m, &n)!=EOF)
{
if(m==0 && n==0) break;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
scanf("%d", &a[i][j]);
if(a[i][j]==2)
{
sx=i; sy=j;
a[i][j]=0;
}
if(a[i][j]==3)
{
gx=i; gy=j;
a[i][j]=0;
}
}
res = 11;
dfs(0, sx, sy, 0);
if(res>10) printf("-1\n");
else
printf("%d\n", res);
}
return 0;
}
DFS poj3009
最新推荐文章于 2020-09-21 16:33:27 发布