1.不越界,不往回走,相邻不为墙“1”的时候才可以移动,为防止往回走,每次移动完都将前一位置赋值为“-1”以区分
2.移动直至遇到墙“1”,或越界,或出口“3”,遇到墙,将墙变为路“0”,继续搜索,搜索完后要恢复为“1”,越界了直接进行下一次搜索,遇到出口处理完数据后直接跳出搜索
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
int map[25][25],s[2],g[2];
int flag,row,col,time,dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(int x,int y,int mov)
{
if(mov>10||mov>time) return;
for(int i=0;i<=3;i++)
{
int x0=x+dir[i][0],y0=y+dir[i][1];
if(map[x0][y0]!=-1&&map[x0][y0]!=1&&x0>=1&&x0<=row&&y0>=1&&y0<=col)
{
while(x0>=1&&x0<=row&&y0>=1&&y0<=col&&map[x0][y0]!=1||map[x0][y0]==3)
{
if(map[x0][y0]==3)
{
time=min(mov,time);//printf("%d %d %d\n",x0,y0,mov);
flag=1;
return;
}
x0+=dir[i][0];
y0+=dir[i][1];
}
if(map[x0][y0]==1)
{
map[x0][y0]=0;
x0-=dir[i][0];
y0-=dir[i][1];
if(x0!=x&&y0!=y) //不能等于原来的位置
map[x0-dir[i][0]][y0-dir[i][1]]=-1;
dfs(x0,y0,mov+1);
map[x0+dir[i][0]][y0+dir[i][1]]=1;
if(x0!=x&&y0!=y)
map[x0-dir[i][0]][y0-dir[i][1]]=0;
}
}
}
}
int main()
{
while(~scanf("%d%d",&col,&row))
{
if(col==0&&row==0) break;
memset(map,0,sizeof(map));
for(int i=1;i<=row;i++)
for(int j=1;j<=col;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==2)
{
s[0]=i;
s[1]=j;
}
}
flag=0;time=15;
dfs(s[0],s[1],1);
if(flag) printf("%d\n",time);
else printf("-1\n");
}
return 0;
}