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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <queue>
#include <utility>
using namespace std;
//----------------------------------------------------------
vector<string> readInput( istream &in )
{
vector<string> result;
for ( string line; getline( in, line ); ) result.push_back( line );
return result;
}
//----------------------------------------------------------
void drawSolution( const vector< vector<int> > &F, int W = 1 )
{
for ( auto &row : F )
{
for ( int e : row )
{
if ( e < 0 ) cout << setw( W ) << '.';
else cout << setw( W ) << e;
}
cout << '\n';
}
}
//----------------------------------------------------------
vector< vector<int> > fill( const vector<string> &board )
{
const vector< pair<int,int> > jp = { {-1,-1}, {-1,0}, {-1,1}, {0,-1}, {0,1}, {1,-1}, {1,0}, {1,1} };
int rows = board.size(), cols = board[0].size();
queue< pair<int,int> > Q;
vector< vector<int> > F( rows, vector<int>( cols, -99 ) );
// Set starting points (as 0) and barriers (as -1)
for ( int i = 0; i < rows; i++ )
{
for ( int j = 0; j < cols; j++ )
{
if ( board[i][j] == 'A' )
{
F[i][j] = 0;
Q.push( { i, j } );
}
else if ( board[i][j] == 'X' )
{
F[i][j] = -1;
}
}
}
// Check adjacent points to current front-of-queue
while( !Q.empty() )
{
auto pr = Q.front(); Q.pop();
int i = pr.first, j = pr.second;
int nextValue = F[i][j] + 1;
for ( int n = 0; n < jp.size(); n++ )
{
int ii = i + jp[n].first, jj = j + jp[n].second; // adjacent point
if ( ii < 0 || ii >= rows || jj < 0 || jj >= cols ) continue; // if outside domain then ignore
if ( F[ii][jj] < -1 ) // not yet set
{
F[ii][jj] = nextValue; // set or improve value
Q.push( { ii, jj } ); // add to current front line
}
}
}
return F;
}
//----------------------------------------------------------
int main()
{
// ifstream in( "input.txt" ); // for real
istringstream in( "..............\n" // for demo
"..............\n"
"..............\n"
"..............\n"
".......X......\n"
".......X......\n"
"...A...X......\n"
"...A...X......\n"
".......X......\n"
".......X......\n" );
vector<string> board = readInput( in );
vector< vector<int> > F = fill( board );
drawSolution( F, 3 );
}
|