
Ход выполнения работы
Согласно заданию требуется использовать волновой метод по модулю 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; } |