#include<iostream>
#include<string>
using namespace std;
int w,h; //矩形的宽和高
struct Position //定义开始点和目标点
{
int w,h;
}start,end;
int map[25][25]; //记录点是否可走
int flag; //标记是否找到结果
int ans; //存放最优值
int direct[4][2] = { {0,1},{1,0},{0,-1},{-1,0}}; //方向数组
void input() //输入函数
{
int a;
for(int i = 1;i <= h;i++)
{
for(int j = 1;j <= w;j++)
{
cin>>a;
if(a == 0)
{
map[i][j] = 0;
}
else if(a == 1)
{
map[i][j] = 1;
}
else if(a == 2)
{
map[i][j] = 0;
start.w = j;
start.h = i;
}
else
{
map[i][j] = 0;
end.w = j;
end.h = i;
}
}
}
return ;
}
bool dfs(Position s,int step) //进行递归
{
if(step > 10)
return false;
for(int i = 0;i < 4;i++)
{
int x,y;
x = s.w + direct[i][0];
y = s.h + direct[i][1];
if(x == end.w && y == end.h)
{
if(ans > step)
ans = step;
flag = 1;
continue;
}
int ff = 0;
int f = 0;
while(x >= 1 && x <= w && y >= 1 && y <= h && !map[y][x])
{
//test(y, x);
f = 1;
x = x + direct[i][0];
y = y + direct[i][1];
if(x == end.w && y == end.h)
{
ff = 1;
if(ans > step)
ans = step;
flag = 1;
break;
}
}
if(f&& !ff)
{
if(x >= 1&& x <= w && y >= 1&&y <= h)
{
map[y][x] = 0;
Position t;
t.w = x - direct[i][0];
t.h = y - direct[i][1];
dfs(t,step + 1);
map[y][x] = 1;
}
}
}
return false;
}
int main()
{
while(cin>>w>>h)
{
if(!w && !h)
break;
input();
flag = 0;
ans = 15;
dfs(start,1);
if(!flag)
{
cout<<"-1"<<endl;
}
else
{
cout<<ans<<endl;
}
}
return 0;
}
poj3009
最新推荐文章于 2017-07-12 09:06:22 发布