bfs+dfs很有意思也很好的一道题
然而我用了很久才ac
#include<iostream> #include<cstring> #include<queue> using namespace std; char mapp[10][10]; int visit[10][10]; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int n,m,o; int sx,sy,ex,ey; int flag; struct stu { int x,y; int d; int flag; }; int bfs() { memset(visit,0,sizeof(visit)); stu x,y; queue<stu>root; x.x=sx;x.y=sy;x.flag=1;x.d=0; visit[x.x][x.y]=1; root.push(x); while(root.size()) { x=root.front(); root.pop(); if(x.x==ex&&x.y==ey&&x.flag==2&&x.d<=o) return 0; for(int i=0;i<4;i++) { y.x=x.x+dir[i][0]; y.y=x.y+dir[i][1]; y.d=x.d+1; if(mapp[y.x][y.y]=='J') y.flag=2; else y.flag=x.flag; if(y.x<0||y.x>=n||y.y<0||y.y>=m||visit[y.x][y.y]==y.flag||mapp[y.x][y.y]=='#'||y.d>o) continue; visit[y.x][y.y]=y.flag; root.push(y); } } return 1; } void dfs(int x) { if(bfs()) flag=1; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { char ma=mapp[i][j]; if(ma=='.'||ma=='J') { mapp[i][j]='#'; if(x>0) dfs(x-1); if(flag) return; mapp[i][j]=ma; } } } } int main() { cin.sync_with_stdio(false); int t; cin>>t; while(t--) { cin>>n>>m>>o; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cin>>mapp[i][j]; if(mapp[i][j]=='S') sx=i,sy=j; if(mapp[i][j]=='E') ex=i,ey=j; } } flag=0; re=1<<30; for(int i=0;i<=4;i++) { dfs(i); if(flag) { cout<<i<<endl; break; } } } return 0; }
时间: 2024-10-28 21:26:07