已过,改动为普通平路不标记为走过不让走,而仅标记鼠标单元格避免重复,代码如下
```cpp
#include<bits/stdc++.h>
using namespace std;
int m,n,dir[4][2]={{0,1},{1,0},{-1,0},{0,-1}},o[105][105],sum=99999,s,u,bex,bey,enx,eny;
void dfs(int xx,int yy,int b,int p){
if(b<=1||u>=99999) return ;
for(int i=0;i<4;i++){
u+=1;
if(o[xx+dir[i][0]][yy+dir[i][1]]!=1&&xx+dir[i][0]>=0&&yy+dir[i][1]>=0&&xx+dir[i][0]<m&&yy+dir[i][1]<n){
if(xx+dir[i][0]==enx&&yy+dir[i][1]==eny){
//if(b==1)continue;
sum=min(sum,p);
continue;
}
if(o[xx+dir[i][0]][yy+dir[i][1]]==-1){
o[xx+dir[i][0]][yy+dir[i][1]]=1;
dfs(xx+dir[i][0],yy+dir[i][1],6,p+1);
o[xx+dir[i][0]][yy+dir[i][1]]=-1;
}
else{
dfs(xx+dir[i][0],yy+dir[i][1],b-1,p+1);//此处
}
}
}
}
int main(){
cin>>m>>n;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>o[i][j];
if(o[i][j]==0) o[i][j]=1;
else if(o[i][j]==1) o[i][j]=0;
if(o[i][j]==3){enx=i;eny=j;o[i][j]=0;}
if(o[i][j]==2){bex=i;bey=j;o[i][j]=1;}
if(o[i][j]==4) o[i][j]=-1;
}
}
dfs(bex,bey,6,1);
if(sum==99999)cout<<-1;
else cout<<sum;
return 0;
}
```
by zombiell810975 @ 2024-04-09 20:34:55