Pagini recente » Istoria paginii utilizator/sile | Monitorul de evaluare | Rating Andrei Hristescu (AndreiHrs) | Istoria paginii utilizator/popovicirob | Cod sursa (job #2162279)
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <queue>
#include <list>
using namespace std;
string s;
int n, m, k;
queue <pair<int,int> > Q;
int a[101][101], spread[101][101];
vector<pair<int,int> > v;
int dx[8] = {0,1,1,1,0,-1,-1,-1};
int dy[8] = {-1,-1,0,1,1,1,0,-1};
ifstream in("rj.in");
ifstream out("rj.out")
void find_closest(){
while(!Q.empty()){
pair<int,int> K = Q.front();
for(int i=0;i<8;i++){
if(spread[K.first+dx[i]][K.second+dy[i]]>0 && spread[K.first+dx[i]][K.second+dy[i]] != spread[K.first][K.second]){
/* for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
cout << spread[i][j] << ' ';
cout << endl;
} */
out << a[K.first+dx[i]][K.second+dy[i]] << ' ' << K.first+dx[i] << ' ' << K.second+dy[i] << '\n';
return;
}
if(a[K.first+dx[i]][K.second+dy[i]]==0 || a[K.first+dx[i]][K.second+dy[i]] > a[K.first][K.second]){
a[K.first+dx[i]][K.second+dy[i]] = a[K.first][K.second] + 1;
spread[K.first+dx[i]][K.second+dy[i]] = spread[K.first][K.second];
Q.push(make_pair(K.first+dx[i],K.second+dy[i]));
}
}
Q.pop();
}
}
int main(){
int y, k=1;
char x;
in >> n >> m;
getline(in,s);
//in.get();
for(int i=1;i<=n;i++){
getline(in, s);
int j;
for(j=1;j<=s.size();j++){
if(s[j-1] == 'R' || s[j-1] == 'J'){
Q.push(make_pair(i,j));
v.push_back(make_pair(i,j));
spread[i][j] = k;
k++;
a[i][j]=0;
}
else if( s[j-1] == 'X')
a[i][j] = -1;
else a[i][j] = 0;
}
for(;j<=m;j++)
a[i][j]=0;
}
for(int i=0;i<=n+1;i++)
a[0][i] = a[n+1][i] = -1;
for(int i=0;i<=m+1;i++)
a[i][0] = a[i][m+1] = -1;
find_closest();
/*
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
cout << spread[i][j] << ' ';
cout << endl;
}
*/
/*while(in >> x >> y){
cout << a[x][y] << '[' << v[spread[x][y]-1].first << ", " << v[spread[x][y]-1].second<< ']' << endl;
}*/
return 0;
}