pushing boxes
#include<bits/stdc++.h> using namespace std; char s1[25][25]; int n,m,cs; int mp[25][25],fm[25][25][4],fb[25][25][4]; int dx[]={0,1,-1,0},dy[]={1,0,0,-1}; string fx="ESNW",fx1="esnw"; bool valid(int x,int y){return x>0&&x<=n&&y>0&&y<=m;} struct node{int x,y,dir;}b,pre[25][25][4]; node pre1[25][25]; int bs[25][25]; int bfs1(pair<int,int> s,pair<int,int> t,pair<int,int> box){ memset(pre1,0,sizeof(pre1)); queue<node> q; while(!q.empty())q.pop(); for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)bs[i][j]=-1; bs[s.first][s.second]=0;q.push((node){s.first,s.second,0}); while(!q.empty()){ node tmp=q.front();q.pop(); if(tmp.x==t.first&&tmp.y==t.second)return bs[t.first][t.second]; for(int i=0;i<4;++i){ int nx=tmp.x+dx[i],ny=tmp.y+dy[i]; if(!valid(nx,ny))continue; if(bs[nx][ny]!=-1||(nx==box.first&&ny==box.second)||mp[nx][ny])continue; bs[nx][ny]=bs[tmp.x][tmp.y]+1; pre1[nx][ny]=(node){tmp.x,tmp.y,i}; q.push((node){nx,ny,0}); } } return -1; } queue<node> q; bool bfs(node s,node t){ while(!q.empty())q.pop(); for(int i=0;i<4;++i){ int nx=b.x-dx[i],ny=b.y-dy[i]; if(!valid(nx,ny)||mp[nx][ny])continue; int pr=bfs1(make_pair(s.x,s.y),make_pair(nx,ny),make_pair(b.x,b.y)); if(pr<0)continue; fm[b.x][b.y][i]=pr; fb[b.x][b.y][i]=0; q.push((node){b.x,b.y,i}); } while(!q.empty()){ node tmp=q.front();q.pop(); if(tmp.x==t.x&&tmp.y==t.y)return true; for(int i=0;i<4;++i){ int nx=tmp.x+dx[i],ny=tmp.y+dy[i]; if(!valid(nx,ny))continue; if(fb[nx][ny][i]!=-1||mp[nx][ny])continue; int pr=bfs1(make_pair(tmp.x-dx[tmp.dir],tmp.y-dy[tmp.dir]),make_pair(nx,ny),make_pair(tmp.x-dx[i],tmp.y-dy[i])); if(pr<0)continue; fm[nx][ny][i]=min(fm[nx][ny][i],fm[tmp.x][tmp.y][tmp.dir]+pr+1); fb[nx][ny][i]=fb[tmp.x][tmp.y][tmp.dir]+1; pre[nx][ny][i]=tmp; q.push((node){nx,ny,i}); } } } void print1(int tx,int ty,int dir){ if(!valid(pre1[tx][ty].x,pre1[tx][ty].y))return; print1(pre1[tx][ty].x,pre1[tx][ty].y,pre1[tx][ty].dir); cout<<fx1[dir]; } void print(int nx,int ny,int dir){ node tmp=pre[nx][ny][dir]; if(!valid(tmp.x,tmp.y))return; print(tmp.x,tmp.y,tmp.dir); cout<<fx[dir]; bfs1(make_pair(tmp.x-dx[tmp.dir],tmp.y-dy[tmp.dir]),make_pair(nx-dx[dir],ny-dy[dir]),make_pair(tmp.x,tmp.y)); print1(nx-dx[dir],ny-dy[dir],dir); } void solve(){ memset(fm,-1,sizeof(fm)); memset(fb,-1,sizeof(fb)); for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)for(int k=0;k<4;++k)pre[i][j][k]=(node){0,0,0}; node s,t; for(int i=1;i<=n;++i)scanf("%s", s1[i]+1),fill(mp[i]+1,mp[i]+n+1,0); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) if(s1[i][j]=='S')s.x=i,s.y=j; else if(s1[i][j]=='B')b.x=i,b.y=j; else if(s1[i][j]=='T')t.x=i,t.y=j; else if(s1[i][j]=='#')mp[i][j]=1; printf("Maze #%d\n",++cs); if(!bfs(s,t))puts("Impossible."); else{ int ans=1e9,ansi; for(int i=0;i<4;++i) if(fb[t.x][t.y][i]<ans&&fb[t.x][t.y][i]!=-1) ans=fb[t.x][t.y][i],ansi=i; bfs1(make_pair(s.x,s.y),make_pair(t.x-dx[ansi],t.y-dy[ansi]),make_pair(b.x,b.y)); print1(t.x-dx[ansi],t.y-dy[ansi],ansi); print(t.x,t.y,ansi); cout<<endl; } } int main(){ while(cin>>n>>m&&n&&m)solve(); }
目前进度:只差了输出部分
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 后端思维之高并发处理方案
· 千万级大表的优化技巧
· 在 VS Code 中,一键安装 MCP Server!
· 想让你多爱自己一些的开源计时器
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析