AtCoder Beginner Contest #007
問題文
$R$ 行 $C$ 列の盤面が与えられる.
各マスは,障害物があるか,空か,で,$1$ ステップで上下左右の空のセルに移動できる.
スタート地点とゴール地点(両方とも空のセルで,移動可能なことは保証されている)が与えられるので,
スタート地点からゴール地点まで最短で何ステップで移動できるかを求める問題.
このような問題は,幅優先探索で解けること,幅優先探索の説明が問題に書かれている.
問題文に書かれている通りにBFSすれば良い.
#include<cstdio>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
#include<string>
#include<utility>
#include<iostream>
#include<cmath>
using namespace std;
#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)
#define mygc(c) (c)=getchar_unlocked()
#define mypc(c) putchar_unlocked(c)
void reader(int *x){int k,m=0;*x=0;for(;;){mygc(k);if(k=='-'){m=1;break;}if('0'<=k&&k<='9'){*x=k-'0';break;}}for(;;){mygc(k);if(k<'0'||k>'9')break;*x=(*x)*10+k-'0';}if(m)(*x)=-(*x);}
void reader(char x[], int len){int i,k;if(len==0)return;for(;;){mygc(k);if(!(k==' '||k=='\n'||k=='\t'||k=='\r')){x[0]=k;break;}}REP(i,1,len)mygc(x[i]);}
void writer(int x, char c){int i,sz=0,m=0;char buf[10];if(x<0)m=1,x=-x;while(x)buf[sz++]=x%10,x/=10;if(!sz)buf[sz++]=0;if(m)mypc('-');while(sz--)mypc(buf[sz]+'0');mypc(c);}
int main(){
int R, C, sr, sc, gr, gc, S, G;
char c[3000];
int i, j, k, RC;
int q[3000], q_st, q_size;
int dist[3000];
reader(&R);
reader(&C);
reader(&sr);
reader(&sc);
reader(&gr);
reader(&gc);
rep(i,R) reader(c+i*C, C);
RC = R*C;
S = (sr-1) * C + (sc - 1);
G = (gr-1) * C + (gc - 1);
int d[4] = {-1, 1, -C, C};
rep(i,RC) dist[i] = -1;
dist[S] = 0;
q[0] = S; q_st = 0; q_size = 1;
while(q_size){
i = q[q_st++]; q_size--;
rep(k,4){
j = i + d[k];
if(c[j]=='#' || dist[j] >= 0) continue;
dist[j] = dist[i] + 1;
q[q_st+q_size++] = j;
}
}
writer(dist[G], '\n');
return 0;
}
Current time: 2024年04月25日21時08分12秒
Last modified: 2014年05月24日04時11分58秒 (by laycrs)
Tags: Competitive_Programming AtCoder AtCoder_Beginner_Contest ABC007 ABC_C
トップページに戻る
Logged in as: unknown user (not login)