Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаба апкс 8.docx
Скачиваний:
11
Добавлен:
05.09.2019
Размер:
329.96 Кб
Скачать

Ход выполнения работы

Согласно заданию требуется использовать волновой метод по модулю 3 , способ проведения трассы – ортогональный, а выбор контактов – независим.

В ходе выполнения была написана программа, которая считывает данные из файла либо потока ввода. Строит матрицу, по которой производится трассировка. Используется модификация алгоритма Ли с большей асимптотической скоростью – алгоритм обхода в ширину с очередью. Программа перебирает все вершины и пытается из каждой организовать новый путь к новой вершине. При невозможности – переходит к новой. Метод не использует различные комбинаторные оптимизации и способен не найти ответа, что обуславливается однородностью перебора порядка путей. После нахождения новой вершины , алгоритм за линейное, время от длины пути возвращается к месту вызова и обозначает новый путь, как невозможный для обхода.

Результаты работы программы:

Рисунок 8 – результат работы

Рисунок 9 – результат работы

Рисунок 9 – Результат работы

Текст программы приведен в Приложении А.

Выводы:

В ходе выполнения данной лабораторной работы мною были изучены методы трассировки печатных соединений, а также написана программа использующая метод обхода в ширину на матрице, с нахождением пути для построения набора соединений платы. Задача в общем виде является NP-полной, что свидетельствует об отсутствии эффективных методов ее решения(без эвристик и допущений), что и подтверждается некоторыми тестами для написанной программы.

Приложение а

#include <iostream>

#include <fstream>

#include <cstdlib>

#include <cstdio>

#include <vector>

#include <queue>

#include <string>

using namespace std;

int main()

{

istream * in;

setlocale(0,"");

cout<<"Ввод из файла или потока ввода(1)? ";

int enterfile;

cin>>enterfile;

if (enterfile)

{

in = & cin;

}

else

{

cout<<"Введите название файла ";

string filename;

cin>>filename;

in = new ifstream(filename.c_str());

}

cout<<"Введите размеры(n,m) "<<endl;

int n,m;

(*in)>>n>>m;

vector<vector<int> > mp(n,vector<int>(m,'.'));

vector<vector<int> > used(n,vector<int>(m,0));

cout<<"Введите количество запрещенных точек ";

cout<<endl;

int counterror;

(*in)>>counterror;

cout<<"Введите запрещенные точки ";

cout<<endl;

for (int i=0;i<counterror;i++)

{

int a,b;

(*in)>>a>>b;

mp[a][b]='x';

}

cout<<"Введите количество начальных точек ";

cout<<endl;

int countbegin;

(*in)>>countbegin;

cout<<"Введите начальные точки ";

cout<<endl;

vector<pair<int,int> > bd;

for (int i=0;i<countbegin;i++)

{

int a,b;

(*in)>>a>>b;

mp[a][b]='a';

bd.push_back(make_pair(a,b));

}

for (int t=0;t<countbegin;)

{

for (int i=0;i<n;i++)

{

for (int j=0;j<m;j++)

{

used[i][j]=0;

}

}

queue<pair<int,int> > Q;

int fa=-1,fb=-1;

Q.push(make_pair(bd[t].first,bd[t].second));

mp[bd[t].first][bd[t].second]='c';

used[bd[t].first][bd[t].second]=3;

while (Q.size())

{

pair<int,int> p = Q.front();

Q.pop();

int a=p.first;

int b=p.second;

if (a)

{

if (mp[a-1][b]!='x'&&mp[a-1][b]!='c'&&used[a-1][b]==0)

{

used[a-1][b]=(used[a][b]+1);

if (used[a-1][b]==4)

used[a-1][b]=1;

Q.push(make_pair(a-1,b));

if (mp[a-1][b]=='a')

{

fa=a-1;

fb=b;

break;

}

}

}

if (a+1<n)

{

if (mp[a+1][b]!='x'&&mp[a+1][b]!='c'&&used[a+1][b]==0)

{

used[a+1][b]=(used[a][b]+1);

if (used[a+1][b]==4)

used[a+1][b]=1;

Q.push(make_pair(a+1,b));

if (mp[a+1][b]=='a')

{

fa=a+1;

fb=b;

break;

}

}

}

if (b)

{

if (mp[a][b-1]!='x'&&mp[a][b-1]!='c'&&used[a][b-1]==0)

{

used[a][b-1]=(used[a][b]+1);

if (used[a][b-1]==4)

used[a][b-1]=1;

Q.push(make_pair(a,b-1));

if (mp[a][b-1]=='a')

{

fa=a;

fb=b-1;

break;

}

}

}

if (b+1<m)

{

if (mp[a][b+1]!='x'&&mp[a][b+1]!='c'&&used[a][b+1]==0)

{

used[a][b+1]=(used[a][b]+1);

if (used[a][b+1]==4)

used[a][b+1]=1;

Q.push(make_pair(a,b+1));

if (mp[a][b+1]=='a')

{

fa=a;

fb=b+1;

break;

}

}

}

}

if (fa==-1)

t++;

else

{

int a=bd[t].first,b=bd[t].second;

while (fa!=a||fb!=b)

{

int next= used[fa][fb]-1;

if (next==0)

next=3;

if (fa)

{

if (used[fa-1][fb]==next)

{

mp[fa][fb]='c';

fa--;

continue;

}

}

if (fa+1<n)

{

if (used[fa+1][fb]==next)

{

mp[fa][fb]='c';

fa++;

continue;

}

}

if (fb)

{

if (used[fa][fb-1]==next)

{

mp[fa][fb]='c';

fb--;

continue;

}

}

if (fb+1<m)

{

if (used[fa][fb+1]==next)

{

mp[fa][fb]='c';

fb++;

continue;

}

}

}

}

}

char tempc='a';

for (int i=0;i<bd.size();i++)

{

mp[bd[i].first][bd[i].second]=tempc++;

}

for (int i=0;i<n;i++)

{

for (int j=0;j<m;j++)

{

if ((mp[i][j])!='c')

cout<<char(mp[i][j]);

else

cout<<'C';

}

cout<<endl;

}

return 0;

}