刚开始因为是广搜,果断超时超内存,其实是深搜回溯
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int maxn=21;
char maze[maxn][maxn];
int di[]={-1,1,0,0},dj[]={0,0,-1,1},n,m,ans;
void dfs(int ci,int cj,int cnt){
if(cnt>=10){
return;
}
for (int i=0;i<4;++i)
{
int ni=ci+di[i],nj=cj+dj[i];
if(ni>=0&&ni<n&&nj>=0&&nj<m&&maze[ni][nj]!='1'){
ni=ci,nj=cj;
for (;ni>=0&&ni<n&&nj>=0&&nj<m;)
{
int nni=ni+di[i],nnj=nj+dj[i];
if(nni>=0&&nni<n&&nnj>=0&&nnj<m){
if(maze[nni][nnj]=='1'){
maze[nni][nnj]='0';
dfs(ni,nj,cnt+1);
maze[nni][nnj]='1';
break;
}else if(maze[nni][nnj]=='3'&&cnt+1<ans){
ans=cnt+1;
return ;
}
}
ni=nni,nj=nnj;
}
}
}
}
int main(){
while (scanf("%d%d",&m,&n))
{
if(!n&&!m)break;
int si,sj;
for (int i=0;i<n;++i)
{
for (int j=0;j<m;++j)
{
cin>>maze[i][j];
if(maze[i][j]=='2'){
si=i,sj=j;
}
}
}
ans=11;
dfs(si,sj,0);
if(ans!=11){
printf("%d\n",ans);
}else{
printf("-1\n");
}
}
return 0;
}