分析:题意就是玩冰壶,2是起点,3是终点,1是障碍物,冰壶在静止状态下,可以往上/下/左/右抛出,且抛出的那个方向的下一个点不能是障碍物或抛出界,抛出后沿直线运动,直到碰到障碍物(障碍物会消失,冰壶会停在障碍物前一个点),或出界(出界就gameover了),如果不能到达终点或抛出冰壶的次数>10次,输出-1,否则输出最少需要抛几次才能到达终点。我们用DFS遍历所有情况,如果抛出的次数>10 了,就肯定不行了。
# include <stdio.h>
int n,m,ans,count,map[25][25];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
void DFS(int x0,int y0)
{
int i,j,a,b;
for(i=0;i<4;i++)
{
a=x0,b=y0;
if(a+dx[i]<0||a+dx[i]>n||b+dy[i]<0||b+dy[i]>=m||map[a+dx[i]][b+dy[i]]==1)
continue;
while(a+dx[i]>=0&&a+dx[i]<n&&b+dy[i]>=0&&b+dy[i]<m&&map[a+dx[i]][b+dy[i]]==0)
{
a+=dx[i];
b+=dy[i];
}
if(a+dx[i]>=0&&a+dx[i]<n&&b+dy[i]>=0&&b+dy[i]<m&&map[a+dx[i]][b+dy[i]]==3&&count+1<ans)
{ans=count+1;return;}
if(a+dx[i]>=0&&a+dx[i]<n&&b+dy[i]>=0&&b+dy[i]<m&&map[a+dx[i]][b+dy[i]]==1&&count<=8)
{
map[a+dx[i]][b+dy[i]]=0;
count++;
DFS(a,b);
count--;
map[a+dx[i]][b+dy[i]]=1;
}
}
}
int main()
{
int i,j,x0,y0;
while(scanf("%d%d",&m,&n)!=EOF)
{
if(n==0&&m==0)
break;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==2)
map[i][j]=0,x0=i,y0=j;
}
count=0; ans=100;
DFS(x0,y0);
if(ans==100)
ans=-1;
printf("%d\n",ans);
}
return 0;
}