解题思路:1深度优先搜索
2 首先找到起始点和终点,同时将起始点改成 board [sx][sy]=0 ;
3 从起始点开始对四个方向进行遍历 ,可以写成int dx[]={0,-1,0,1}; int dy[]={-1,0,1,0}; 扔出了界外或直接碰到了block则继续,否则,如果是0,继续更新横纵坐标值,途中遇到block, 首先按原路退回一步,dfs , 再将block置1;如果是3,也dfs。
#include<stdio.h>#include<iostream>
using namespace std;
int dx[]={0,-1,0,1};
int dy[]={-1,0,1,0};
int m;
int n;
int Min;
int step;
int sx,sy;
int gx,gy;
int board[20][20];
void dfs(int x,int y,int step){
if(step>10){
return;
}
if(x==gx&&y==gy){
if(step<Min)
Min=step;
return ;
}
for(int i=0;i<4;i++){
int xx = x+dx[i];
int yy = y+dy[i];
if(xx<0||yy<0||xx>=m||yy>=n||board[xx][yy]==1)
continue;
if(board[xx][yy]==3){
dfs(xx,yy,step+1);
break;
}
while(board[xx][yy]==0){
xx+=dx[i];
yy+=dy[i];
if(xx<0||yy<0||xx>=m||yy>=n)
break;
if(board[xx][yy]==1){
int X=xx-dx[i];
int Y=yy-dy[i];
board[xx][yy]=0;
dfs(X,Y,step+1);
board[xx][yy]=1;
}
if(board[xx][yy]==3){
dfs(xx,yy,step+1);
continue;
}
}
}
}
int main(){
int i,j;
while(~scanf("%d%d",&n,&m)&&(n*n+m*m)!=0){
for(i=0;i<m;i++)
for( j=0;j<n;j++)
scanf("%d",&board[i][j]);
for( i=0;i<m;i++)
for( j=0;j<n;j++){
if(board[i][j]==2){
sx =i;
sy =j;
board[i][j]=0;
}
if(board[i][j]==3){
gx=i;
gy=j;
}
}
Min = 11;
step=0;
dfs(sx,sy,step);
if(Min==11)
cout<<-1<<endl;
else
cout<<Min<<endl;
}
return 0;
}