<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [題解]2024 ICPC臺中(中國臺灣)區域賽-Drunken Maze

      • Sources:D-Drunken Maze
      • Abstract:給定 n × m ( 12 ≤ n × m ≤ 2 × 1 0 5 , 3 ≤ n , m ≤ 1 0 4 ) n\times m(12\le n\times m\le 2\times 10^5, 3\le n,m\le 10^4) n×m(12n×m2×105,3n,m104)的地圖,# 表示墻壁,. 表示空地,S 表示起點,T 表示終點。要求不能超過連續 3 3 3步走同一方向,不可以通過障礙。起點終點視作空地。問 ST 的最小步數。若無解輸出 ? 1 -1 ?1
      • Keyword:搜索(銅牌題)
      • Solution:注意到 n n n m m m非常大,因此無法用結構體存圖。改用動態處理隊列。設計狀態數組 d i s t dist dist,注意到圖中每個點可通過求解其 i d id id進而將狀態數組壓至三維。 d i s t [ i d ] [ d i r ] [ c n t ] dist[id][dir][cnt] dist[id][dir][cnt]代表沿 d i r dir dir方向上經過 c n t cnt cnt次到達頂點 i d id id。注意處理當 c n t cnt cnt到達 3 3 3時不可繼續沿此方向繼續走。
      • Code:實現上可采用 B F S BFS BFS,或 D F S DFS DFS+記憶化。下面給出 B F S BFS BFS實現。
      #include<bits/stdc++.h>
      using namespace std;
      const int MAX=1e4;
      const int INF=1e9;
      char mapp[MAX][MAX];
      int n,m,sy,sx,ty,tx;
      struct node{
          int y,x,pre_dir,cnt;//pre_dir:上一步自何方向而來,0-4 cnt:方向上已經走了多少步,0-2
      };
      queue<node>q;
      int getid(int y,int x){//計算頂點坐標
          return y*m+x;
      }
      int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};//(y,x):right,left,down,up
      bool check1(int y,int x){//越界/撞墻檢測
          return y>=0&&y<n&&x>=0&&x<m&&mapp[y][x]!='#';
      }
      bool check2(int y,int x){//終點檢測
          return x==tx&&y==ty;
      }
      void bfs(){
          vector<vector<vector<int>>>dis(n*m,vector<vector<int>>(4,vector<int>(3,INF)));//狀態數組,三個維度分別表示id,dir,cnt,初始化所有點均為不可達
          for(int i=0;i<4;i++){//處理起點的四個方向
              int ny=sy+dir[i][0],nx=sx+dir[i][1];
              if(check1(ny,nx)){//越界/撞墻檢測
                  int id=getid(ny,nx);
                  if(dis[id][i][0]>1){//起點擴散的點一定可達
                      dis[id][i][0]=1;
                      q.push({ny,nx,i,1});
                  }
              }
          }
          bool f=0;//判斷是否有解
          while(q.size()){
              int ans=dis[getid(q.front().y,q.front().x)][q.front().pre_dir][q.front().cnt-1];
              if(check2(q.front().y,q.front().x)){//已到達終點
                  cout<<ans,f=1;
                  break;
              }
              for(int i=0;i<4;i++){//考察當前點的四個方向
                  int now=0;//記錄當前方向上走的步數
                  if(i==q.front().pre_dir){//沿當前方向繼續走
                      now=q.front().cnt+1;
                      if(now>3) continue;//不能繼續走了
                  }else now=1;//未沿當前方向繼續走
                  int ny=q.front().y+dir[i][0],nx=q.front().x+dir[i][1];
                  if(check1(ny,nx)){//越界/撞墻檢測
                      if(dis[getid(ny,nx)][i][now-1]>ans+1){//可以擴散的點一定可達
                          dis[getid(ny,nx)][i][now-1]=ans+1;
                          q.push({ny,nx,i,now});
                      }
                  }
              }
              q.pop();
          }
          if(!f) cout<<-1;//無解
      }
      int main(){
          ios::sync_with_stdio(0),cin.tie(0);
          cin>>n>>m;
          for(int i=0;i<n;i++)
              for(int j=0;j<m;j++){
                  cin>>mapp[i][j];
                  //記錄特殊點S和T的位置
                  if(mapp[i][j]=='S') sy=i,sx=j;
                  else if(mapp[i][j]=='T') ty=i,tx=j;
              }
          bfs();
          return 0;
      }
      
      posted @ 2025-02-09 16:55  椰蘿Yerosius  閱讀(44)  評論(0)    收藏  舉報  來源
      主站蜘蛛池模板: 一区二区三区四区五区自拍| 99精品久久免费精品久久| 青草99在线免费观看| 蜜臀91精品高清国产福利| 无码任你躁久久久久久久| 亚洲精品国偷自产在线| 少妇激情一区二区三区视频小说 | 毛片在线看免费| 欧美成人精品高清在线播放| 亚洲欧洲日韩精品在线| 日韩中文字幕v亚洲中文字幕| 国产成人亚洲精品日韩激情| 日韩av爽爽爽久久久久久 | 99久久精品费精品国产一区二| 亚洲av片在线免费观看| 久久国产精品老人性| 九九热在线免费视频精品| 中文字幕无码色综合网| 精品午夜福利无人区乱码| 开鲁县| 国产一区二区精品久久岳| 国产免费高清69式视频在线观看 | 国内自拍小视频在线看| 欧美老少配性行为| 精品无码一区二区三区电影| 潜江市| 亚洲精品毛片一区二区| 成人精品区| 久久青青草原亚洲AV无码麻豆| 精品综合久久久久久97| 亚洲中文字幕无码爆乳| 亚洲欧洲av人一区二区| 欧美成本人视频免费播放| 美女内射无套日韩免费播放| 免费十八禁一区二区三区| 亚洲第一区二区快射影院| 国产精品疯狂输出jk草莓视频| 美乳丰满人妻无码视频| 无码日韩做暖暖大全免费不卡| 国产一区二区精品久久凹凸| aⅴ精品无码无卡在线观看|