#22232: C++ 2ms 策略


s10806226@smail.ycsh.tp.edu.tw (Eri)

學校 : 臺北市立永春高級中學
編號 : 108040
來源 : [101.3.116.101]
最後登入時間 :
2022-05-11 14:14:13
a982. 迷宮問題#1 | From: [219.91.14.225] | 發表日期 : 2020-08-17 02:34

用queue做BFS
先用陣列 maze[][] 存迷宮 且以int作為型態
並以-1表示牆壁
0表示可以走的路
先令maze[2][2]=1
從(2,2)開始 每走一步就紀錄已走幾步 而步數會是前一格+1
一直做直到終點 而答案正會是maze[n-1][n-1]

以下是我的程式碼 歡迎參考
(btw的迷宮陣列是以(0,0)做開頭,所以會跟上面講的有點不一樣)

#include <cstdio>
#include <queue>
#define N 100

using namespace std;

struct s{
    int x,y;
};

int main()
{
    int n,maze[N][N],dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
    while(scanf("%d",&n)!=EOF){
        char tmp[N];
        for(int i=0;i<n;i++){
            scanf("%s",&tmp);
            for(int j=0;j<n;j++){
                if(tmp[j]=='#')maze[i][j]=-1;
                else maze[i][j]=0;
            }
        }
        bool flag=false;
        int xx,yy;
        queue<s> q;
        q.push({1,1});
        maze[1][1]=1;
        while(q.size() && !flag){
            xx=q.front().x,yy=q.front().y;
            if(xx==n-2 && yy==n-2){
                flag=true;
                break;
            }
            for(int i=0;i<4;i++){
                if(maze[xx+dir[i][0]][yy+dir[i][1]]==0){
                    q.push({xx+dir[i][0],yy+dir[i][1]});
                    maze[xx+dir[i][0]][yy+dir[i][1]]=maze[xx][yy]+1;
                }
            }
            q.pop();
        }
        if(flag)printf("%d\n",maze[n-2][n-2]);
        else printf("No solution!\n");
    }
    return 0;
}
 
ZeroJudge Forum