怎么保证可以往回走的同时不重复搜索
查看原帖
怎么保证可以往回走的同时不重复搜索
1104479
zombiell810975楼主2024/4/9 20:31

wa on #12 代码如下 标准dfs

#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{
				o[xx+dir[i][0]][yy+dir[i][1]]=1;
				dfs(xx+dir[i][0],yy+dir[i][1],b-1,p+1);
				o[xx+dir[i][0]][yy+dir[i][1]]=0;
			} 
		}
	}
}
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;
}
2024/4/9 20:31
加载中...