怎么保证可以往回走的同时不重复搜索

P2802 回家

已过,改动为普通平路不标记为走过不让走,而仅标记鼠标单元格避免重复,代码如下 ```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


|