1 solutions
-
2
[USACO11OPEN] Corn Maze S
唐诗
代码后加了一些小tips(在文末)
先看题面,当看到“最短时间”时就应该直接反应到这是一个要求最短路的问题,还是走迷宫系列
考虑bfs
如我在推荐里说的,这个题考细节,有坑
那么我认为最坑的地方就是
滑梯不能标记,因为他可能只是一个中转站
看这个例子:
#####=####### ####...###### #####A####### #####@####### ############# ###A######### ###.#########
在这个例子里,我们需要利用两次A滑梯,但如果标记了就会无解
剩下的就没什么了
上代码
#include<iostream> #include<queue> #define int long long using namespace std; const int dx[4]={-1,1,0,0}; const int dy[4]={0,0,-1,1}; struct node{ int x,y,cnt; }; queue<node> q; struct slide{ int xs=-1,ys=-1,xd=-1,yd=-1; }s[26]; int n,m,stx,sty,dex,dey; char a[305][305]; bool vis[305][305]; void bfs(int i,int j){ q.push({i,j,0}); vis[i][j]=1; while(!q.empty()){ node t=q.front(); q.pop(); if(t.x==dex&&t.y==dey){//到终点了 cout<<t.cnt; return; } if(a[t.x][t.y]>='A'&&a[t.x][t.y]<='Z'){//滑梯 int num=a[t.x][t.y]-'A'; if(s[num].xs!=-1&&s[num].xd!=-1){ if(t.x==s[num].xs&&t.y==s[num].ys) t.x=s[num].xd,t.y=s[num].yd;//起->终 else t.x=s[num].xs,t.y=s[num].ys;//终->起 } } for(int ppp=0;ppp<4;ppp++){//搜连通块 int nx=t.x+dx[ppp]; int ny=t.y+dy[ppp]; if(nx>0&&nx<=n&&ny>0&&ny<=m&&!vis[nx][ny]){//没有超出边界且没有被访问过 q.push({nx,ny,t.cnt+1}); vis[nx][ny]=1; } } } } signed main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; if(a[i][j]=='@') stx=i,sty=j;//start else if(a[i][j]=='=') dex=i,dey=j;//destination else if(a[i][j]=='#') vis[i][j]=1;//corn else if(a[i][j]>='A'&&a[i][j]<='Z'){//slide int num=a[i][j]-'A'; if(s[num].xs==-1) s[num].xs=i,s[num].ys=j; else s[num].xd=i,s[num].yd=j; } } } bfs(stx,sty); return 0; }
还有,在遇到滑梯改坐标时直接用原坐标改(点名狗叶)
top.x = tpe[(int)a[top.x][top.y] ].x,top.y = tpe[(int)a[top.x][top.y] ].y;
这样第二条语句会改
在新的x坐标和原来的y坐标的点的y坐标
显然不对,所以要像文中一样搞一个临时变量来储存原来的点,再进行传送操作
求个赞QAQ
- 1
Information
- ID
- 793
- Time
- 1000ms
- Memory
- 512MiB
- Difficulty
- 3
- Tags
- # Submissions
- 15
- Accepted
- 3
- Uploaded By