题目说的是 给了一个n*m的矩阵然后 一个石头 可以向上下左右 移动 记住 一旦移动 了就自由朝着这个方向一直移动 知道停下来停下来的 三个条件
1 遇到边界 表示游戏结束游戏失败
2 遇到block 就是下一步就会遇到 block 然后停下来 block消失
3 遇到目标点 停下来游戏成功
每次停下来后要想在走 必须加一次 移动 然后计算最小的移动使得 石头到达目的地
模拟的 进行深搜
#include<cstdio> #include<string.h> #include<iostream> using namespace std; const int maxn=25; int maze[maxn][maxn]; int dirx[]={0,0,1,-1}; int diry[]={1,-1,0,0}; int m,n,sx,sy,ex,ey,mav; void dfs(int x,int y,int dir,int time){ int xx=x;int yy=y,tx,ty; if(x==ex&&y==ey){ if(time<mav) mav=time; return ; } if(time>=mav) return ; while(true){ tx=xx+dirx[dir]; ty=yy+diry[dir]; if(tx<0||tx>=n||ty<0||ty>=m)return ; if(tx==ex&&ty==ey){ if(time<mav) mav=time; return ; } if(maze[tx][ty]==1) break; xx=tx; yy=ty; } maze[tx][ty]=0; for(int i=0;i<4;i++){ int rx=xx+dirx[i]; int ry=yy+diry[i]; if(rx>=0&&rx<n&&ry>=0&&ry<m&&maze[rx][ry]==0){ dfs(rx,ry,i,time+1); } } maze[tx][ty]=1; } int main(){ while(true){ scanf("%d%d",&m,&n); if(n==0&&m==0) break; for(int i=0;i<n;i++) for(int j=0;j<m;j++){ scanf("%d",&maze[i][j]); if(maze[i][j]==2){ sx=i;sy=j; maze[i][j]=0; } if(maze[i][j]==3){ ex=i;ey=j; maze[i][j]=0; } } mav=11; for(int i=0;i<4;i++){ int xx=sx+dirx[i]; int yy=sy+diry[i]; if(maze[xx][yy]==0&&xx<n&&xx>=0&&yy<m&&yy>=0){ dfs(xx,yy,i,1); } } if(mav==11)printf("-1 "); else printf("%d ",mav); } return 0; }