C - 幅優先探索 / AtCoderBeginnerContest #007
#include <iostream> #include <string> #include <queue> using namespace std; #define MAX 50 typedef pair<int,int> P_II; int BFS(int r, int c, string field[], int start, int goal) { int step=0; bool flg[MAX][MAX]={ {false} }; const int dx[4]={1, 0, -1, 0}, dy[4]={0, 1, 0, -1}; queue<P_II> que; que.push( P_II(0,start) ); while ( !que.empty() ) { P_II p_ii=que.front(); que.pop(); if ( !flg[p_ii.second/100][p_ii.second%100] ) { flg[p_ii.second/100][p_ii.second%100]=true; step=p_ii.first; if (p_ii.second == goal) break; for (int i=0; i<4; ++i) { int y=p_ii.second/100+dy[i], x=p_ii.second%100+dx[i]; if (0<=y && y<r && 0<=x && x<c && field[y][x]=='.' && !flg[y][x]) que.push( P_II(step+1,y*100+x) ); } } } return step; } void Solve(int r, int c) { string field[MAX]; int sy, sx, gy, gx; cin >> sy >> sx >> gy >> gx; for (int i=0; i<r; ++i) cin >> field[i]; cout << BFS(r,c,field,(sy-1)*100+(sx-1),(gy-1)*100+(gx-1) ) << endl; } int main(void) { int r, c; cin >> r >> c; Solve(r,c); return 0; }
xとyの座標が50以下であることから、100を掛けて繋げた。
その後、目的地までの距離を数え出力。
~了~