20240331_搜尋練習

HelloHeBin發表於2024-03-31

目錄
  • P3206 Dungeon Master
  • P3207 Lake Counting
  • P3208 The Castle
  • P896 仙島求藥
  • P429 【基礎】走迷宮
  • P2465 迷宮問題
  • P952 【入門】算24點

P3206 Dungeon Master

這題是一個三維迷宮,其中用‘.’表示空地,‘#’表示障礙物,‘S’表示起點,‘E’表示終點,求從起點到終點的最小移動次數,解法和二維的類似,只是在行動時除了東南西北移動外還多了上下。可以上下左右前後移動,每次都只能移到相鄰的空位,每次需要花費一分鐘,求從起點到終點最少要多久。

  • 分析
    最少步數,考慮bfs,三維使用偏移陣列
點選檢視程式碼

P3207 Lake Counting

有一塊N×M的土地,雨後積起了水,有水標記為‘W’,乾燥為‘.’。八連通的積水被認為是連線在一起的。

請求出院子裡共有多少水窪?

點選檢視程式碼
#include<iostream>
using namespace std;
const int N=110;
char s[N][N];
bool st[N][N];
int n,m,ans;
int d[][2]={-1,-1, -1,0, -1,1, 0,-1, 0,1, 1,-1, 1,0,1,1};

void dfs(int x,int y){
    st[x][y] = 1;
    for(int i=0; i<8; i++){
        int a=x+d[i][0], b=y+d[i][1];
        if(a<0||a>=n||b<0||b>=m) continue;
        if(s[a][b]=='.' || st[a][b]) continue;
        dfs(a, b);
    }
}
int main(){
    cin>>n>>m;
    for(int i=0; i<n; i++) cin>>s[i];
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            if(s[i][j]=='W' && !st[i][j]){ dfs(i,j); ans ++; }
    cout<<ans;
    return 0;
}


P3208 The Castle

點選檢視程式碼

P896 仙島求藥

少年李逍遙的嬸嬸病了,王小虎介紹他去一趟仙靈島,向仙女姐姐要仙丹救嬸嬸。孝順的李逍遙闖進了仙靈島,克服了千險萬難來到島的中心,發現仙藥擺在了迷陣的深處。迷陣由M×N個方格組成,有的方格內有可以瞬秒李逍遙的怪物,而有的方格內則是安全。現在李逍遙想盡快找到仙藥,顯然他應避開有怪物的方格,並經過最少的方格,而且那裡會有神秘人物等待著他。現在要求你來幫助他實現這個目標。

點選檢視程式碼
#include<queue>
#include<cstring>
#include<iostream>
using namespace std;
const int N=22;
int n,m,ans,d[][2]= {-1,0, 1,0, 0,-1, 0,1};
char s[N][N];
int st[N][N];

struct T {
    int x,y;
};
int sx,sy;
int bfs(int x,int y) {
    memset(st, 0x00, sizeof st); // 8bit 
    queue<T> q;
    q.push({x,y}), st[x][y] = 1;
    while(q.size()) {
        auto u = q.front();
        q.pop();
        x=u.x, y=u.y;
        if(s[x][y]=='*') return st[x][y]-1;
        for(int i=0; i<4; i++) {
            int a=x+d[i][0], b=y+d[i][1];
            if(a<0||a>=n||b<0||b>=m) continue;
            if(s[a][b]=='#' || st[a][b]) continue;
            q.push({a,b}), st[a][b] = st[x][y]+1;
        }
    }
    return -1;
}
int main() {
//    freopen("da.in", "r", stdin);
    while(cin>>n>>m, n) {
        if(n+m==0) break;
        for(int i=0; i<n; i++) cin>>s[i];
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
                if(s[i][j]=='@') {
                    sx=i, sy=j;
                    break;
                }
        int t = bfs(sx,sy);
        cout<<t<<endl;
    }
    return 0;
}

P429 【基礎】走迷宮

點選檢視程式碼

P2465 迷宮問題

點選檢視程式碼

P952 【入門】算24點

點選檢視程式碼

相關文章