• Source
    1. #include <iostream>
    2. #include <vector>
    3. #include <queue>
    4. using namespace std;
    5.  
    6. int R, C;
    7. char grass[102][102];
    8. int R_B, C_B;
    9. int R_C, C_C;
    10. void read ()
    11. {
    12. cin>>R>>C;
    13. for (int i=1; i<=R; i++)
    14. {
    15. for (int j=1; j<=C; j++)
    16. {
    17. cin>>grass[i][j];
    18. if (grass[i][j]=='B')
    19. {
    20. R_B = i;
    21. C_B = j;
    22. }
    23. if (grass[i][j]=='C')
    24. {
    25. R_C = i;
    26. C_C = j;
    27. }
    28. }
    29. }
    30. }
    31.  
    32. int check[102][102];
    33. int mark[102][102];
    34. struct data
    35. {
    36. int r, c;
    37. } typedef data;
    38. vector <data> v[102][102];
    39. int y_ar[]={+0, -1, +0, +1};
    40. int x_ar[]={+1, +0, -1, +0};
    41. void init ()
    42. {
    43. for (int i=1; i<=R; i++)
    44. for (int j=1; j<=C; j++)
    45. {
    46. check[i][j]=0;
    47. mark[i][j]=0;
    48. }
    49.  
    50. for (int i=1; i<=R; i++)
    51. for (int j=1; j<=C; j++)
    52. if (grass[i][j]=='.' || grass[i][j]=='B' || grass[i][j]=='C')
    53. for (int k=0; k<4; k++)
    54. {
    55. int Y=i+y_ar[k];
    56. int X=j+x_ar[k];
    57. if (Y>=1 && Y<=R && X>=1 && X<=C && (grass[Y][X]=='.' || grass[Y][X]=='B' || grass[Y][X]=='C'))
    58. {
    59. data tmp;
    60. tmp.r=Y;
    61. tmp.c=X;
    62. v[i][j].push_back(tmp);
    63. }
    64. }
    65. }
    66.  
    67. queue <data> q;
    68. void BFS ()
    69. {
    70. int i=R_B, j=C_B;
    71. data tmp;
    72. tmp.r=i;
    73. tmp.c=j;
    74. q.push (tmp);
    75. check[i][j]=1;
    76. while (!q.empty())
    77. {
    78. data u = q.front();
    79. q.pop();
    80. for (int k=0; k<v[u.r][u.c].size(); k++)
    81. {
    82. data tmp = v[u.r][u.c][k];
    83. if (check[tmp.r][tmp.c]==0)
    84. {
    85. q.push (tmp);
    86. check[tmp.r][tmp.c]=1;
    87. mark [tmp.r][tmp.c]=mark[u.r][u.c]+1;
    88. }
    89. }
    90. }
    91. }
    92.  
    93. int main ()
    94. {
    95. read ();
    96. init ();
    97. BFS ();
    98. cout<<mark[R_C][C_C];
    99. return 0;
    100. }