题意:给你一个矩阵 1是冰块 2是 起点 3 是终点
条件 冰球只能四个方向移动(滑行) 碰到冰块才能停下 (改变方向) 碰完冰块 冰块就被球撞碎了
如果起点四个方向都是冰块 被认为是不可以移动的
移动的不能超过10步
/*
32ms 132k
*/
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<climits>
#define maxn 25
#define inMap(x,y) 0<=x&&x<n&&0<=y&&y<m
#define sca(a) scanf("%d",&a)
#define scab(a,b) scanf("%d%d",&a,&b)
using namespace std;
int Map[maxn][maxn];
int ans;
bool flag;
int m,n,startx,starty,endx,endy;
int ef[4][2]={ { 1,0 },{ 0,1 },{ -1,0 },{ 0,-1 } };//方向
void dfs(int x,int y,int step)
{
if(step>10)
{
return;
}
if(ans<=step)
return;
for(int i=0;i<4;i++)
{
int nextx=x+ef[i][0],nexty=y+ef[i][1];
if (inMap(nextx,nexty)&&Map[nextx][nexty]==0){
while(inMap(nextx,nexty)&&Map[nextx][nexty]==0)
{
if(nextx==endx&&nexty==endy)
{
if(ans>step)
{
ans=step;
}
if(!flag)
{
flag=true;
}
}
nextx+=ef[i][0];
nexty+=ef[i][1];
}
if(inMap(nextx,nexty)&&Map[nextx][nexty]==1)
{
Map[nextx][nexty]=0;
dfs(nextx-ef[i][0],nexty-ef[i][1],step+1);
Map[nextx][nexty]=1;
}
}
}
}
int main()
{
while(~scab(m,n)&&n+m)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
sca(Map[i][j]);
if(Map[i][j]==2)
{
startx=i;
starty=j;
Map[i][j]=0;
}
if(Map[i][j]==3)
{
endx=i;
endy=j;
Map[i][j]=0;
}
}
}
flag=false;
ans=INT_MAX;
dfs(startx,starty,1);
if(flag&&ans<=10){
printf("%d\n",ans);
}
else{
printf("-1\n");
}
}
return 0;
}