-
Notifications
You must be signed in to change notification settings - Fork 0
/
2.cpp
56 lines (48 loc) · 1.82 KB
/
2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//入力
const int INF = 100000000;
//状態を表すクラスpairの場合、typedefしておくと便利である
typedef pair<int,int> P;
//入力
char maze[MAX_N][MAX_M+1]; //迷路を表す文字列の増加
int N,M;
int sx,sy; //スタートの座標
int gx,gy; //ゴールの座標
int d[MAX_N][MAX_M]; //各点までの最短距離の配列
//移動4方向のベクトル˜
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
//(sx,sy)から(gx,gy)への最短経路を求める
//辿りつけないとINF
int bfs(){}
queue<P> que;
//全ての点をINFで初期化する
for(int i=0;i<N;i++){
for(int j=0; j<M;j++) d[i][j] = INF;
//スタート地点にをキューに入れ、その点の距離をゼロにする
que.push(P(sx,sy));
d[sx],[sy] = 0;
//キューが空になるまでループする
while(que.size()){
//キューの先頭を取り出す
P p = que.front(); que.pop();
//取り出してきた状態がゴールなら探索をやめる
if(p.first == gx && p.second == gy) break;
//移動4方向をループする
for(int i=0;i<4;i++){
//移動した後の点を(nx,ny)とする
int nx = p.first + dy[i], ny = p.second + dy[i];
//移動が可能かの判定と、すでに訪れたことがあるかの判定(d[nx][ny] != INFならば訪れたことがある)
if(0<= nx && ny < N && 0<= nx&& ny < M && maze[nx][ny] != '#'&&
d[nx][ny] == INF){
//移動できるならキューに入れて、そのてんの距離をpからの距離+1で確定する
que.push(P(nx,ny));
a[nx][ny] = d[@.first][p.second]+1;
}
}
}
return d[gx][gy];
}
void solve(){
int res = bfs();
printf("%d\n", res);
}
}