C++程序算法題----迷宮(一)


題目:

一天蒜頭君掉進了一個迷宮里面,蒜頭君想逃出去,可憐的蒜頭君連迷宮是否有能逃出去的路都不知道。看在蒜頭君這么可憐的份上,就請聰明的你告訴蒜頭君是否有可以逃出去的路。

輸入格式

第一行輸入兩個整數 n和 m,表示這是一個 n×m的迷宮。接下來的輸入一個 n行 m列的迷宮。其中 'S' 表示蒜頭君的位置,'*'表示牆,蒜頭君無法通過,'.'表示路,蒜頭君可以通過'.'移動,'T'表示迷宮的出口(蒜頭君每次只能移動到四個與他相鄰的位置——上,下,左,右)。

輸出格式

輸出一個字符串,如果蒜頭君可以逃出迷宮輸出"yes",否則輸出"no"。

數據范圍

1≤n,m≤10。

Sample Input

3 4

S**.

..*.

***T

Sample Output

no

Sample Input 2

3 4

S**.

....

***T

Sample Output 2

yes

思路:思路來源

運用深度搜索。找到人的位置,因為只能從上下左右四個方向出發,所以每到一個點,先判斷是否是終點,然后考慮這個點是否是在該棋盤上,是否能走,是否已經走過。最后如果能出去,則輸出yes,否則輸出no。

代碼

#include<iostream>
#include<cstring>
#include<stdio.h>
int n,m;
char road[15][15]; //棋盤
bool is_run[15][15]={false}; //是否已經走過
int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}}; // 分別代表四個方向
bool out = false; //是否可以出去
using namespace std;
// 因為要從4個方向出發,所以需要判斷下一個點是否在地圖里
bool in_road(int x,int y){
    return (0<=x&&x<n)&&(0<=y&&y<m);
}
void DFS(int x,int y){
    if(road[x][y]=='T'){
        //找到出口
        out = true;
        return;
    }
    if(!in_road(x,y)||road[x][y]=='*'||is_run[x][y]){
        return;
    }
    is_run[x][y] = true;
    for(int i=0;i<4;i++){
        int tx = x+dir[i][0];
        int ty = y+dir[i][1];
        DFS(tx,ty);
    }
    return;
}
int main(){
    int x,y;
    cin>>n>>m;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>road[i][j];
            if(road[i][j]=='S'){
                x = i;
                y = j;
            }
        }
    }
    DFS(x,y);
    if(out){
        cout<<"yes"<<endl;
    }else{
        cout<<"no"<<endl;
    }
    return 0;
}

運行結果:



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM