POJ|拯救公主 BFS

這里需要注意的問題就是,移動到有寶石的位置荠卷,也需要時間模庐,只是拿寶石不花費時間。在輸入的時候油宜,遇到起始位置或者結束位置就記錄下來掂碱,并將其改為.,因為實際上在移動的過程當中慎冤,起始點和結束點也只是普通的點疼燥。
用了二進制壓縮的方法來存儲。也需要注意visit數(shù)組蚁堤,與一般的visit數(shù)組不同醉者,這里又多加了一個維度,用來存儲當前位置的寶石個數(shù)披诗。
另外湃交,應該把direction的循環(huán)放在內(nèi)層,這樣可以一定程度簡化問題藤巢。

#include<iostream>
#include<vector>
#include<map>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;

int direction[4][2] = {{1,0}, {-1, 0}, {0,1},{0,-1}};
int r,c,k;
int sx, sy, ex, ey; // 開始的點和結束的點
// 如果visit數(shù)組只有兩維,有可能在遍歷的過程中寶石數(shù)目增加 而之前的visit如果已經(jīng)被設置為true 那么之后也不會再訪問到
bool visit[200][200][1<<5];  // 記錄特定的發(fā)現(xiàn)寶石狀態(tài)下息罗,特定位置的被訪問情況
char board[200][200];
vector<pair<int, int>> door; // 傳送門的位置

bool Check(int gem){
     int cnt = 0;
     for(int i = 0; i <= 4; i++){
          if(((gem >> i) & 1) == 1)
               cnt++;
     }
     return (cnt >=k);
}

bool Judge(int x, int y, int s){
     if(x < 0 || y < 0 || x >= r || y >= c || visit[x][y][s] || board[x][y] == '#')
          return false;
     return true;
}

struct Status{
     int step;  // 到當前這一步花費的時間
     int gem;  // 當前寶石的個數(shù)
     int x,y;  // 當前位置
     Status(int x,int y,int s,int g):x(x), y(y), step(s), gem(g){}
};

int main(){
     int T;
     cin>>T;
     while(T--){
          memset(visit, 0, sizeof(visit));
          memset(board, 0, sizeof(board));
          door.clear();  // 全局變量 這里要記得清空
          bool flag = 0;
          queue<Status> q;
          cin>>r>>c>>k;
          for(int i = 0; i < r; i++){
               for(int j =0; j < c; j++){
                    cin>>board[i][j];
                    if(board[i][j] == 'S'){
                         sx = i;
                         sy = j;
                         board[i][j] = '.';
                    }
                    if(board[i][j] == 'E'){
                         ex = i;
                         ey = j;
                         board[i][j] = '.';
                    }
                    if(board[i][j] == '$'){
                         door.push_back(pair<int, int>(i,j));
                    }
               }
          }
          q.push(Status(sx,sy,0,0));  // 初始狀態(tài)
          visit[sx][sy][0] = true;
          while(!q.empty()&&!flag){
               Status cur = q.front();
               q.pop();
               if(Check(cur.gem) && cur.x == ex && cur.y == ey){
                    cout<<cur.step<<endl;
                    flag= 1;
                    break;
               }
               // visit[cur.x][cur.y] = true;
               // 擴展四個方向
               if(board[cur.x][cur.y] == '.'){
                    for(int i = 0; i < 4; i++){
                         int nx = cur.x+direction[i][0];
                         int ny = cur.y+direction[i][1];
                         if(!Judge(nx, ny, cur.gem))
                            continue;
                         visit[nx][ny][cur.gem] = true;
                         q.push(Status(nx,ny, cur.step+1, cur.gem));
                    }
               }

               if(board[cur.x][cur.y] == '$'){
                    for(int j = 0; j < door.size(); j++){
                         // 把所有傳送門周圍的坐標放入隊列
                         int fir = door[j].first;
                         int sec = door[j].second;
                         for(int i = 0; i < 4; i++){
                              int nx = fir+direction[i][0];
                              int ny = sec+direction[i][1];
                              if(!Judge(nx, ny, cur.gem))
                                 continue;
                              visit[nx][ny][cur.gem] = true;
                              q.push(Status(nx,ny, cur.step+1, cur.gem));
                         }
                    }
               }
               
               if(board[cur.x][cur.y] <= '4' && board[cur.x][cur.y] >= '0' ){
                    int cur_gem_cnt = cur.gem | (1 << (board[cur.x][cur.y]-'0'));
                    
                    for(int i = 0; i < 4; i++){
                         int nx = cur.x+direction[i][0];
                         int ny = cur.y+direction[i][1];
                         if(!Judge(nx, ny, cur_gem_cnt))
                              continue;
                         visit[nx][ny][cur_gem_cnt] = true;
                         q.push(Status(nx, ny, cur.step+1, cur_gem_cnt));
                    }
               }
               
          }
          if(!flag)
               cout<<"oop!"<<endl;
          
     }
     
     
     return 0;

}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掂咒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子迈喉,更是在濱河造成了極大的恐慌绍刮,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挨摸,死亡現(xiàn)場離奇詭異孩革,居然都是意外死亡,警方通過查閱死者的電腦和手機得运,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門膝蜈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锅移,“玉大人,你說我怎么就攤上這事饱搏》翘辏” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵推沸,是天一觀的道長备绽。 經(jīng)常有香客問我,道長鬓催,這世上最難降的妖魔是什么肺素? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮宇驾,結果婚禮上倍靡,老公的妹妹穿的比我還像新娘。我一直安慰自己飞苇,他們只是感情好菌瘫,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著布卡,像睡著了一般雨让。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忿等,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天栖忠,我揣著相機與錄音,去河邊找鬼贸街。 笑死庵寞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的薛匪。 我是一名探鬼主播捐川,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逸尖!你這毒婦竟也來了古沥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤娇跟,失蹤者是張志新(化名)和其女友劉穎岩齿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苞俘,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡盹沈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吃谣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乞封。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡做裙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出歌亲,到底是詐尸還是另有隱情菇用,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布陷揪,位于F島的核電站惋鸥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悍缠。R本人自食惡果不足惜卦绣,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望飞蚓。 院中可真熱鬧滤港,春花似錦、人聲如沸趴拧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽著榴。三九已至添履,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脑又,已是汗流浹背暮胧。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留问麸,地道東北人往衷。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像严卖,于是被迫代替她去往敵國和親席舍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • --繪圖與濾鏡全面解析 概述 在iOS中可以很容易的開發(fā)出絢麗的界面效果哮笆,一方面得益于成功系統(tǒng)的設計俺亮,另一方面得益...
    韓七夏閱讀 2,727評論 2 10
  • 前言 本篇文章是對該文章的翻譯,如有疑問可對照原文疟呐。 一、介紹 什么是malloc东且?如果連這個名兒都沒有聽說的話启具,...
    凌云壯志幾多愁閱讀 1,967評論 2 2
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復雜珊泳,今天將帶大家一窺ios動畫全貌鲁冯。在這里你可以看...
    每天刷兩次牙閱讀 8,488評論 6 30
  • 在iOS中隨處都可以看到絢麗的動畫效果拷沸,實現(xiàn)這些動畫的過程并不復雜,今天將帶大家一窺iOS動畫全貌薯演。在這里你可以看...
    F麥子閱讀 5,110評論 5 13
  • 轉(zhuǎn)載自:http://3code.info/2017/01/18/SDiffuseMenu/ 源碼在這里:http...
    Myth2015閱讀 275評論 0 0