日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Bob的烦恼II 逃离迷宫

發(fā)布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Bob的烦恼II 逃离迷宫 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

XTU熱身賽出的題。本來這次比賽可以多些幾道的,可惜腦袋漿糊掉了。。以后要更加努力,希望能超過師兄,師姐們啊。言歸正傳:

這道題首先一看,它就是一道搜索題。搜索題:一般無外乎兩種方法 1、DFS。2、BFS。想了想DFS只要用一個標(biāo)記pre[maxn][maxn]的數(shù)組記錄前一個坐標(biāo)的方向就行,如果和前面不同則step++。后來果斷超時。于是想起了BFS,怎么去判斷它是否轉(zhuǎn)彎呢?一個方向搜到底,到底時換方向的時候拐彎數(shù)加一,那么出隊再拓展路徑的時候拐彎數(shù)肯定也要加一,因為與這個點在一條直線上的點已經(jīng)全部入隊了。于是就有了下面的代碼:?

?

?

#include?<iostream>
?#include?<queue>
?#include?<cstdlib>
?#include?<cstring>
?#include?<cmath>
?#define?MAX_LEN?101
?using?namespace?std;
?
?struct?node
?{
?????int?x,y;
?????int?step?;
?}in?,?out;
?
?queue?<node>?Q;
?
?const?int?move[4][2]?=?{-1,0,?0,1?,?1,0?,?0,-1};
?int?flag[MAX_LEN?+?10][MAX_LEN?+?10];?????????//標(biāo)記?
?char?map[MAX_LEN?+?10][MAX_LEN?+?10];
?int?n,m,bx,by,ex,ey,k;?????//入口坐標(biāo)?
?
?
?void?init()
?{
?????memset(flag?,?false?,?sizeof(flag));
?????while(!Q.empty())?Q.pop();
?????memset(map?,?0?,?sizeof(map));
?}
?
?
?bool?Check(int?x,?int?y)
?{
?????if(x?>=?1?&&?x?<=?n?&&?y?>=?1?&&?y?<=?m?&&?map[x][y]?==?'.')?return?true;
?????return?false;
?}
?
?void?BFS()
?{
?????if(bx?==?ex?&&?by?==?ey)
?????{
?????????printf("yes\n");
?????????return?;
?????}
?????
?????flag[bx][by]?=?true;
?????in.x?=?bx;?in.y?=?by?;?in.step?=?-1;
?????Q.push(in);
?????while(!Q.empty())
?????{
?????????out?=?Q.front();
?????????Q.pop();
?????????int?x?=?out.x;
?????????int?y?=?out.y;
?????????for(int?i?=?0;?i?<?4?;?i++)
?????????{
?????????????int?xx?=?x?+?move[i][0];
?????????????int?yy?=?y?+?move[i][1];
?????????????while(Check(xx?,?yy))
?????????????{
????????????????if(flag[xx][yy]?==?false)
????????????????{
?????????????????????flag[xx][yy]?=?true;
?????????????????????in.x?=?xx;
?????????????????????in.y?=?yy;
?????????????????????in.step?=?out.step+1;??????//轉(zhuǎn)彎的次數(shù)
?????????????????????Q.push(in);
?????????????????????if(in.x?==?ex?&&?in.y?==?ey?&&?in.step?<=?k)
??????????????????????{
?????????????????????????????printf("yes\n");
?????????????????????????????return?;
??????????????????????}?//如果找到
?????????????????}
?????????????????xx?+=?move[i][0];
?????????????????yy?+=?move[i][1];
?????????????}
?????????}
???????}
?????printf("no\n");
?????return?;
?}
?
?int?main()
?{
?????int?t;
?????while(~scanf("%d",?&t))
?????{
?????????while(t--)
?????????{
?????????????init();
?????????????scanf("%d?%d",?&n?,?&m);
?????????????for(int?i?=?1;i?<=?n;?i++)
?????????????{
???????????????for(int?j?=?1?;?j?<=?m?;j++)
???????????????????scanf("?%c"?,?&map[i][j]);
?????????????}
?????????????
?????????????scanf("%d%d%d%d%d",?&k?,?&by?,?&bx?,?&ey?,?&ex);
?????????????BFS();
?????????}
?????}
?????//system("pause");
?????return?0;
?}

?

??這個題不一個方向搜到底肯定是錯的,即使用優(yōu)先隊列把拐彎少的先出隊來拓展路徑也是不對的!

可以設(shè)想如果不把一個方向上的點先入隊的話,那么有可能一個不需要拐彎的點在拓展時會被弄成要拐彎才能走到,這時候就不對了!

? 一個方向搜到底,搜到底時換方向的時候拐彎數(shù)加一,那么出隊再拓展路徑的時候拐彎數(shù)肯定也要加一,因為與這個點在一條直線上的點已經(jīng)全部入隊了。

轉(zhuǎn)載于:https://www.cnblogs.com/g0feng/archive/2012/05/20/2510247.html

總結(jié)

以上是生活随笔為你收集整理的Bob的烦恼II 逃离迷宫的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。