Решение задачи №426 «Lines - 2» с ACMP





Решение задачи №426 «Lines - 2» с ACMP

Условие задачи

В таблице из N строк и N столбцов некоторые клетки заняты шариками, другие свободны. Выбран шарик, который нужно переместить, и место, куда его нужно переместить. Выбранный шарик за один шаг перемещается в соседнюю по горизонтали или вертикали свободную клетку. Требуется выяснить, возможно ли переместить шарик из начальной клетки в заданную, и, если возможно, то найти путь из наименьшего количества шагов.

Входные данные
В первой строке входного файла INPUT.TXT находится число N, в следующих N строках - по N символов. Символом точки обозначена свободная клетка, английской заглавной O - шарик, @ - исходное положение шарика, который должен двигаться, английской заглавной X - конечное положение шарика. (2 ≤ N ≤ 250)

Выходные данные
В выходной файл OUTPUT.TXT выведите в первой строке «Y», если движение возможно, или «N», если нет. Если движение возможно, то далее следует вывести N строк по N символов - как и на вводе, но буква X, а также все точки по пути следует заменить плюсами. Если решений несколько, выведите любое.

#include<iostream>
#include<queue>
using namespace std;
int main() {
int n,i,j,k,x1,y1,x2,y2,u,v;queue<pair<int,int>>q;
int x[4]={-1,1,0,0},y[4]={0,0,-1,1};
cin>>n;int d[n][n],p[n][n];string a[n];
for(i=0;i<n;++i){cin>>a[i];
for(j=0;j<n;++j){d[i][j]=1000000000;
if(a[i][j]=='@'){x1=i;y1=j;}
else if(a[i][j]=='X'){x2=i;y2=j;}}}
d[x1][y1]=0; q.push(make_pair(x1,y1));
while(!q.empty()){i=q.front().first;
j=q.front().second;q.pop();
for(k=0;k<4;++k){u=i+x[k];v=j+y[k];
if(u>=0&&u<n&&v>=0&&v<n&&
a[u][v]!='O'&&d[u][v]>d[i][j]+1){
d[u][v]=d[i][j]+1;p[u][v]=k;
q.push(make_pair(u,v));}}}
if(d[x2][y2]<1000000000){
cout<<'Y';i=x2;j=y2;
while(a[i][j]!='@'){a[i][j]='+';
k=p[i][j];i-=x[k];j-=y[k];}
for(i=0;i<n;++i)cout<<endl<<a[i];}
else cout<<'N';
return 0;}



Условия задач взяты с сайта acmp.ru